一些常见的方面:
第三个可能是您问题的核心,但这实际上是“编译器特定的启发式” - 您需要检查编译器文档,但通常他们不会提供太多保证。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)仍然会内联,因此内联在这里只有边际效应。
总结一下:在少数情况下,您应该尝试通过放置(或省略)内联语句来手动控制内联。