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++内联函数的主要内容,如果未能解决你的问题,请参考以下文章

何时可以/将在 C++ 中内联函数?可以强制内联行为吗?

C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?

复习笔记——C++内联函数

c++中的内联函数inline

C++基础--inline

内联函数和宏