Oracle® Solaris Studio 12.4:性能分析器

退出打印视图

更新时间: 2015 年 1 月
 
 

内联函数

内联函数是这样的函数:在函数的调用点上(而不是实际调用上)为其插入由编译器生成的指令。 有两种类型的内联,执行它们都可提高性能,并且它们都影响性能分析器。这两种类型是 C++ 内联函数定义和显式或自动内联。

  • C++ 内联函数定义。此情况下内联的理论基础是,调用函数的成本比内联函数完成的工作要大得多,因此在调用点上插入函数的代码比设置函数调用好得多。通常,访问函数被定义为进行内联,因为它们通常仅需要一条指令。使用 –g 选项进行编译时,会禁用函数内联;使用 –g0 编译时,允许函数内联,这是建议的做法。

  • 在高优化级别(4 和 5)上,编译器执行显式或自动内联。甚至在打开 –g 时,也会执行显式和自动内联。这种类型内联的理论基础可能在于,节省了函数调用的成本,但更为常见的目的是提供可以优化寄存器使用和指令调度的更多指令。

这两种类型的内联对于度量的显示具有相同的效果。出现在源代码中但已被内联的函数不出现在函数列表中,也不显示为它们内联到的函数的被调用方。否则在内联函数的调用点上显示为非独占度量的度量(表示被调用函数中所用的时间)实际上将显示为归属到调用点的独占度量(表示内联函数的指令)。


注 -  内联可能会使数据难以解释,因此在编译程序以进行性能分析时,可能希望禁用内联。不应禁用 C++ 访问函数的内联,因为它会导致高性能成本。

在某些情况下,甚至在函数被内联时,会留下所谓的外部函数 (out-of-line function)。某些调用点调用外部函数 (out-of-line function),而其他调用点使指令内联。在这样的情况下,函数出现在函数列表中,但归属到该函数的度量仅表示外部调用 (out-of-line call)。