在C++中调用函数存在一个潜在的缺点:调用函数一般比求等价表达式的值要慢一些。在大多数机器上,一次函数调用其实包含着一系列工作:调用前要先保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转向一个新的位置继续执行。
内联函数可避免函数调用的开销
将函数指定为内联函数(inline), 通常就是将它在每个调用点上“内联地”展开。假设我们把shorter String函数定义成内联函数,则如下调用
cout << shorterString(s1, s2) << endl;
将在编译过程中展开成类似于下面的形式
cout << (s1.size() < s2.size() ? s1 : s2) << endl;
从而消除了shorterString函数的运行时开销。
在shorterString函数的返回类型前面加上关键字inline
,这样就可以将它声明成内联函数了:
inline const string & shorterString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。
一般来说, 内联机制用于优化规模较小、流程直接、频繁调用的函数。很多编译器都不支持内联递归函数,而且一个75行的函数也不大可能在调用点内联地展开。