前言
对于C++程序,需要预编译、编译、汇编、链接四个步骤才能成为可执行文件进而运行。而inline函数在编译期间执行。本文将结合上一节所说函数调用堆栈的开销,说明inline函数和普通函数的区别以及优点。
普通函数调用堆栈
int sum(int a,int b)
{
return a+b;
}
int ret3=sum(a,b);
对于普通函数sum(a,b)
的调用,会执行标准的函数调用过程:
1、参数压栈
2、开辟函数栈帧
3、执行完毕回退函数栈帧
inline函数调用
inline函数在调用时,会在编译期间将inline函数内的函数体代码展开到函数调用的位置,比如:
inline int sum(int a,int b)
{
return a+b;
}
会在int ret3=sum(a,b)
这个调用点将sum(a,b)
展开成return (a,b)
。这样就免去了sum(a,b)
这个函数的调用开销。本身inline函数体直接展开,那么inline函数在程序的内存布局中就不会再生成这个函数的.text符号。
总结
如果函数调用开销远远大于函数体的执行开销,那么就可以使用inline函数。但是尤其要注意inline函数在编译期间执行,如果一个函数必须要到运行期间才能执行,就不能使用inline。比如递归函数,其递归深度只有在运行期间才能确定,就不可以使用inline函数。而且inline函数内部如果逻辑代码较多,几十行代码,这样就没有必要。加上了inline,函数也不一定就会执行内联。编译器仅仅给函数加上建议执行内联,并不算是强制。