inline 函数详解

定义

内联函数和普通函数一样,区别仅仅是在被调用处直接使用机器码替换的形式。
直接采用机器码替换的目的是:减少因调用而造成的开销,加速执行效率。
很多编程语言包括:c,c++,python 都提供了内联函数的概念,他们的作用是相同的,都是通过“替换”代替“调用”,来加速程序的执行效率。下面让我们对内联函数的特性进一步剖析和验证。

内联函数的使用方法与底层调用原理

使用内联时的调用方法:

inline void inlined_swapf(float *p1, float *p2)
{float tmp = *p1;*p1 = *p2;*p2 = tmp;
}

上述为一个 C 语言编写的 内联函数,通过关键字 inline 定义该函数为内联函数。则当该函数被其他函数调用时,假设在指令 1、2中调用了该内联函数,则其执行的逻辑是:

不使用内联时的调用方法:

void swapf(float *p1, float *p2)
{float tmp = *p1;*p1 = *p2;*p2 = tmp;
}

上述是一个普通函数,则当该函数被其他函数调用时,假设在指令 1、2中调用了该非内联函数,则其执行的逻辑是:

测试程序:

既然内联函数可以提升效率,我们就比较下内联函数和非内联函数在相同情况下执行时间的情况。
测试平台为 ESP32, 但大部分平台都可以参考下述代码稍加更改进行验证。

// 交换值
inline void inlined_swapf(float *p1, float *p2)
{float tmp = *p1;*p1 = *p2;*p2 = tmp;
}
// float 类型排序
void selection_sortf1(float a[], int n)
{int i, j, mini;for (i=0; i<n - 1; ++i) {mini = i;for (j=i+1; j<n; ++j) {if (a[j] < a[mini]) {mini = j;}}inlined_swapf(a+i, a+mini);}
}
// 交换值
void swapf(float *p1, float *p2)
{float tmp = *p1;*p1 = *p2;*p2 = tmp;
}
// float 类型排序
void selection_sortf2(float a[], int n)
{int i, j, mini;for (i=0; i<n - 1; ++i) {mini = i;for (j=i+1; j<n; ++j) {if (a[j] < a[mini]) {mini = j;}}swapf(a+i, a+mini);}
}void app_main(void)
{printf("Hello world!\n");float a[1024] = {1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0};volatile uint64_t total_time = esp_timer_get_time();for (int i=0; i<50; i++) {selection_sortf1(a, sizeof(a)/sizeof(float));}total_time = esp_timer_get_time() - total_time;printf("inline: %llu\r\n", total_time);total_time = esp_timer_get_time();for (int i=0; i<50; i++) {selection_sortf2(a, sizeof(a)/sizeof(float));}total_time = esp_timer_get_time() - total_time;printf("no-inline: %llu\r\n", total_time);
}

程序测算时间:

Hello world!
inline: 2955830
no-inline: 2958393

结论:相同测试程序,内联函数运行的时间小于 非内联函数,即内联函数的确可以节省时间,提升运行效率。

如何使用内联函数

适合声明为内联函数的场景:经常被调用的小函数。
不适合声明为内联函数的场景:含较大循环运算的函数、递归函数。
如上述示例的 inlined_swapf() 涉及的代码简单短小,在selection_sortf1() 中被调用的次数比较多,因此可以声明为 inline,而 selection_sortf1() 本身涉及大循环,不适合声明为内联函数。

注意事项:声明为内联的函数是在编译时生成成指令嵌入对应的指令块中,成为真正的内联函数,还是最终被编译成普通的函数调用,取决于编译器,具体是否真的处理为内联函数,可以使用反汇编进行查看。

内联函数(inline 函数)详解相关推荐

  1. CSS之排列系列--块级元素、内联元素、内联块元素--区别/详解

    原文网址:CSS之排列系列--块级元素.内联元素.内联块元素--区别/详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍CSS的块级元素(block).内联元素(inline)和内联块元素(inl ...

  2. html内联元素和块元素的特性,HTML中块级元素和内联元素的特性详解

    原标题:HTML中块级元素和内联元素的特性详解 在网站布局中经常会遇到元素进行居中的时候,设置了text-align:center:margin:0 auto;有时候会起作用,但有时候对居中无效,刚接 ...

  3. 内联函数(inline)详解

    为什么要有内联函数 在学习内联函数之前,大家可以写一个实现加法的宏ADD(),检测一下自己. 如果对宏等预编译知识不太熟悉的话,可以先看一下这篇文章:预编译--2.2.4 以下是一个正确的ADD宏: ...

  4. C++内联(inline)函数

    内联函数 内联函数是一种特殊类型的函数,内联函数在定义或声明时前面加上"inline"关键字.比如: inline int max(int a,int b) { return (a ...

  5. inline函数返回值_C++ inline关键字详解

    当程序执行函数调用指令时,CPU将存储该函数调用后指令的内存地址,将函数的参数复制到堆栈上,最后将控制权转移到指定的函数.然后,CPU执行函数代码,将函数返回值存储在预定义的内存位置/寄存器中,并将控 ...

  6. 【Python养成】常用内置函数 — 2(详解25个内置函数)

    图片来自互联网 文章目录 前言 二.内置函数详解 1.函数:chr(x) 2.函数:dir([obj]) 3.函数:divmod(x,y) 4.函数:enumerate(sequence, [star ...

  7. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  8. countif和sum套用_if函数嵌套countif、sumif函数实例操作详解 你需要学习了

    excel中if函数嵌套countif函数实例操作详解,需要了解if函数.countif函数.sumif函数字符串引用方式,isblank函数 操作方法 01 用扫描枪连接excel后将自动将货物名称 ...

  9. python def函数报错详解_Python函数详解

    一.Python中函数的概念 1.python中函数概念 Python中函数是逻辑结构化和过程化的一种编程方法. 2.python中函数定义方法解释 def name(a): "The fu ...

  10. python range函数怎么表示无限_Python for循环与range函数的使用详解

    for 循环 for - in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(iterates),即它会遍历序列中的每一个项目 注意: 1.else 部分是可选的.当循环中包含它时,它循环中 ...

最新文章

  1. 2022-2028年中国UTM市场投资分析及前景预测报告
  2. 实战:使用OpenCV+Python+dlib为人脸生成口罩
  3. AI+视频分析:实时监测无处不在的安全风险
  4. 面板panel与窗口frame的区别
  5. spring12:注解的方式实现di(依赖注入)
  6. 数据结构与算法 -- 栈 ADT
  7. access重复数据累计_Access 查询同一张表中两个或以上字段含有重复项的记录
  8. Eclipse 中隐藏的 5 个非常有用的功能
  9. mysql slave 状态_python脚本 监控MySQL slave 状态
  10. 21、List遍历时修改元素的问题
  11. Unity使用UniWebview插件内嵌H5游戏
  12. maya藤蔓插件_MAYA快速打造藤蔓生长的路径动画教程
  13. RTU设备功能及选型
  14. 计算机基础网络空间安全,网络空间安全学院“首届计算机基础知识竞赛”圆满结束...
  15. python统计word页码_python 实现 Word Count
  16. 云炬股市学习笔记20220118
  17. PTA团体天梯赛汇总
  18. 鲁大师2021牛角尖奖最强性能手机揭晓,小米12 Pro拿下大奖
  19. 刘未鹏:为什么你应该(从现在开始就)写博客
  20. 计算机网络-详解DNS域名解析全过程

热门文章

  1. django外键获取数据
  2. wampserve启动不了mysql的解决方法
  3. 参考文献去哪里查找,参考文献标准格式是什么
  4. Flutter测试(一): Widget 测试了解一下
  5. meltdown linux 内核,内核开发者称应更新Linux内核应对 Meltdown 和 Spectre漏洞
  6. 【02 英语语法:复句的语法】
  7. matlab灰度归一化,[转载]matlab图像处理为什么要归一化和如何归一化?
  8. Android自定义View面试总结
  9. java http ipv6_如何在Java上同时支持IPv4和IPv6
  10. 达内机构python培训费用