一、什么是内联函数?为什么使用内联函数?
调用函数是需要一定的时间和空间的开销的。
上图表示函数调用的过程,1程序执行函数调用前的语句;2流程的控制转移到被调用函数的入口处,同时进行参数传递;3执行被调用函数中函数体语句;4流程返回到调用函数的下一条指令处,将函数返回值带回;5接着执行主调函数中未执行的部分。
在2执行之前,要记下当时指令的地址还要“保护现场”(记下当时有关的信息),以便在函数调用之后继续执行,流程返回到先前记下的地址处,并根据记录下的信息“恢复现场”,然后继续执行,这些都是需要一定的时间。
C++提高了一种高效的方法,在编译程序时将所调用的函数的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为“内置函数”,也叫作内联函数。
二、内联函数的使用方法
指定内联函数的方法很简单,只需要在函数首行的左端加一个关键字inline.
例:
inline int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int ret = max(4,5);
system("pause");
return 0;
}
上面的程序中,max函数就是内联函数。注意:可以在函数的声明和定义时同时加inline,也可以只在一处声明inline.
三、什么时候使用inline?
当然使用inline也是要付出代价的,因为inline是进行代码的插入,所以无形中会增加程序的长度,因此一般将规模很小而使用频繁的函数声明为内联函数。在函数规模很小的情况下,函数调用时间的开销可能会超过执行函数本身的时间,这时把他定义为inline可大大节省程序运行时间。内联函数中不能包括复杂的语句,如循环和switch语句。要注意,对函数做inline声明,只是用户对编译系统的一个建议,编译系统会根据具体情况决定是否这样做。
四、inline成员函数
类的成员函数也可以指定为内联函数。如果类的成员函数在类内定义,在默认是内联函数,如果类的成员函数在类外定义,则需要加inline关键字显示的声明为内联函数。值得注意的是,如果在类外定义inline函数,则必须将类定义和成员函数的定义都放到同一个头文件中,否则编译时无法将函数代码拷贝到函数的调用点。只有在类外定义的成员函数规模很小而且调用频率很高时,才将此成员函数指定为内联函数。