C++内联函数
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++内联函数相关的知识,希望对你有一定的参考价值。
内联函数
软件在调用、运行一个函数的时候,计算机系统需要申请内存空间,对函数参数进行压栈,函数调用完之后,数据进行出栈。
所以,频繁调用一个函数的时候,计算机系统需要频繁地申请空间,对数据进行压栈和出栈。耗费很多的系统资源。从而降低程序的执行效率。C++提供一种提高效率的方法,即在编译的时候将所调用函数的代码嵌入到主函数中。
所以,增加了代码量,但是,减少了函数调用时压栈弹栈等“时间资源”开销,所以,是一个“空间换时间”的问题。所以,空间开销增加,时间开销减少。
这种嵌入到主函数中的函数称为 内联函数(inline function),又称为 内嵌函数。
定义内联函数的方法很简单,只须在函数的首行的左端增加一个关键字 inline 即可。如下是一个程序测试例子:
程序运行结果如下:
由于在定义函数时指定它为内联函数,因此,编译系统在遇到函数调用 max(i, j, k) 时,就用 max 函数体的代码代替 max(i, j, k),同时,将实参代替形参。这样,m = max(i, j, k) 就被置换成:
{
a = i; b = j; c = k;
if(b > a) a = b;
if(c > a) a = c;
m = a;
}
内联函数与用 #define 命令实现的带参宏定义有些相似,但不完全相同。宏定义是在编译前由预处理程序对其预处理的,它只作简单的字符置换而不作语法检查,往往会出现意想不到的错误。
如下的例子,是用带参数宏定义实现求平方值。
程序运行结果如下:
输出的结果是:
9 --- 执行 power(3) = 3 * 3 = 9
3 --- 执行 power(1 + 1) = 1 + 1* 1 + 1 = 1 + 1 + 1 = 3
其实,在使用 #define 定义 power 宏的时候,应该加上相应的括号来限制,应该
#define power(x) (x*x)
这样 power(5 + 5) = (5 + 5) * (5 + 5) = 10 * 10 = 100
如果不用 #define ,而用内联函数,则可以避免上面的副作用:
程序运行结果如下:
可以看到:用带参宏定义和内联函数都可以实现代码的置换,但具体的做法不同,用内联函数可以达到用 #define 宏置换的目的,但不会出现带参宏定义的副作用。
显然,内联函数优于带参宏定义。自从有了内联函数之后,一般不再用 #define 带参宏定义了。
使用内联函数可以节省运行时间,但却增加了目标程序的长度。假设要调用10次 power 函数,则在编译时先后 10 次将 power的代码复制并插入到main()函数中,大大增加了main函数的长度。因此,只用于规模很小,而且,使用频繁的函数,可大大提高运行速度。
韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip
以上是关于C++内联函数的主要内容,如果未能解决你的问题,请参考以下文章