Oracle® Developer Studio 12.5:C++ 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

9.2 使用内联函数

使用扩展内联而不使用正常调用时,对小而快速的函数的调用可以更小更快速。反过来,如果使用扩展内联而不建立分支,则对又长又慢的函数的调用会更大更慢。另外,只要函数定义更改,就必须重新编译对内联函数的所有调用。因此,使用内联函数时要格外小心。

如果预计函数定义会更改而且重新编译所有调用程序非常耗时,请不要使用内联函数。而如果扩展函数内联的代码比调用函数的代码少,使用函数内联时应用程序执行速度显著提高,则可以使用内联函数。

编译器不能内联所有函数调用,因此要充分利用函数内联,可能需要进行一些源码更改。可使用 +w 选项了解何时不会进行函数内联。在以下情况中,编译器将不会内联函数:

  • 函数包含了复杂控制构造,例如循环、switch 语句和 try/catch 语句。这些函数很少多次执行复杂控制构造。要内联这种函数,请将函数分割为两部分:里边的部分包含复杂的控制构造,而外边的部分决定何时调用里边的部分。即使编译器可以内联完整函数,从函数常用部分中分隔出不常用部分的这种技术也可以改善性能。

  • 内联函数体又大又复杂。因为对函数体内其他内联函数的调用,或因为隐式构造函数和析构函数调用(通常发生在派生类的构造函数和析构函数中),所以简单函数体可以非常复杂。对于这种函数,内联扩展很少提供显著的性能改善,所以函数一般不内联。

  • 内联函数调用的参数既大又复杂。对于内联成员函数调用的对象是内联函数调用的自身这种情况,编译器特别敏感。要内联具有复杂参数的函数,只需将函数参数计算到局部变量并将变量传递到函数。