C++中内联函数详解
内联函数背景:函数是可以重复使用的代码块,CPU一条条执行其中的代码。CPU在执行主调函数代码如果调用了其他函数,停止主函数的执行,转而执行被调的其他函数,执行完之后再返回主程序,继续执行主程序,这就是程序的调用过程。
函数的调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,将实参、局部变量、返回地址以及若干寄存器压入栈中,然后才能执行函数体的代码;执行函数体代码还要进行现场清理,即将原来压入栈中数据出栈,然后继续执行函数体后的代码。
如果被调函数体代码比较多,需要执行比较长时间,则调用机制所占时间可以忽略;如果函数体只有一两行,那么大部分时间花费在调用的机制上,这种时间开销就可以通过内敛涵数省去。
内敛函数:为了消除函数调用的时空开销,C++提供一种高效方法,即在编译时函数调用处用函数体代替,类似C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(inline),又称为内嵌函数或者内置函数。下面是一个例子:
#include <stdio.h>
//函数定义为inline即:内联函数
inline char* dbtest(int a)
{
return (i % 2 > 0) ? "奇" : "偶";
}
int main()
{
int i = 0;
for (i=1; i < 100; i++)
{
printf("i:%d 奇偶性:%s /n", i, dbtest(i));
}
}
关键字inline:内联函数的关键字inline,是用于实现的关键字,而不是声明的关键字。若只在声明中加关键字,函数实现中不添加关键字,则此函数不是内联函数。
inline函数的使用是有限制的
既然内联函数能够省去函数调用的时空开销,那为什么不将所有函数都用内联函数呢?**内联函数是以代码膨胀(复制)**为代价的,只是省去了函数调用的执行效率,如果函数执行函数体时间比较长,那么这样的效率收获也较小,因为每一处内联调用要复制代码,将使程序的代码量大大增加,消耗更多的内存空间。
以下两种情况不应使用内联函数:
- 函数体代码较长,使用内联将会导致内存消耗代价较高;
- 如果函数体内出现循环(出现while swicth),或者函数是本身递归函数(内部调用函数本身),那么执行函数体内部代码的时间本身时间要比函数调用开销大。
所以如果执意使用代码量较大的内联函数,就是为了节省调用函数那一点时间,从而占用更大内存空间。
参考:博客1