到底啥是内联(inline)函数?为什么内联函数效率比较高呢?
要想解决上述问题,就必须先来说说普通的函数调用是怎样的流程.在大多数机器上,一次函数调用其实包含着一系列工作:1.调用前先保存寄存器,并在返回时恢复;2.可能需要拷贝实参;3.程序转向一个新的位置继续执行等等.这些无疑都是函数调用时的开销,而内联函数则可以避免函数调用产生的这些开销,因此它的效率比较高.
内联函数是怎么避免函数调用时的开销呢?举一个例子:
const string& shorterString( const string& str1, const string& str2 ){
return str1.size() <= str2.size() ? str1 : str2;
}
这是一个普通的函数,而定义成内联函数之后,则如下调用
cout << shorerString( s1, s2 ) << endl;
将在编译过程中展开成类似于下面的形式
cout << (s1.size() <= s2.size() ? s1 : s2) << endl;
从而消除了shorterString函数的运行时开销.
在函数的返回类型前加上关键词inline,这样就可以将它声明成内联函数了.
值得注意的是,内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求.至于编译器到底同意内联请求还是忽略,我们也不知道.一般来说,简短的函数声明为inline时,编译器大概率会同意内联请求;而对于复杂函数,编译器一般会忽略.