内联函数(何时插入)?

Nav*_*een 6 c++

内联函数只是对编译器的请求,这些编译器在使用该函数的代码中的每个位置插入内联函数的完整主体.

但是编译器如何决定是否应该插入它?它使用哪种算法/机制来决定?

谢谢,

纳文

pet*_*hen 4

一些常见的方面:

  • 编译器选项(调试版本通常不会内联,大多数编译器都可以选择覆盖内联声明以尝试内联全部或不内联)
  • 合适的调用约定(例如,可变参数函数通常不是内联的)
  • 适合内联:取决于函数的大小、函数的调用频率、内联的增益以及优化设置(速度与代码大小)。通常,微小的函数具有最大的好处,但是如果只调用一次巨大的函数,则可能会被内联
  • 内联调用深度和递归设置

第三个可能是您问题的核心,但这实际上是“编译器特定的启发式” - 您需要检查编译器文档,但通常他们不会提供太多保证。MSDN 有一些有关 MSVC 的(有限)信息。

除了琐碎的事情(例如简单的 getter 和非常原始的函数)之外,内联本身不再有太大帮助。调用指令的成本下降了,分支预测也大大提高了。

内联的绝佳机会是删除编译器知道不会被采用的代码路径 - 作为一个极端的例子:

inline int Foo(bool refresh = false)
{
   if (refresh)
   {
      // ...extensive code to update m_foo  
   }
   return m_foo;
}
Run Code Online (Sandbox Code Playgroud)

一个好的编译器会内联Foo(false),但不是Foo(true)

使用链接时间代码生成,Foo可以驻留在 .cpp 中(没有inline声明),并且Foo(false)仍然会内联,因此内联在这里只有边际效应。


总结一下:在少数情况下,您应该尝试通过放置(或省略)内联语句来手动控制内联。