gpt4 book ai didi

c++ - 内联函数(何时插入)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:03 25 4
gpt4 key购买 nike

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

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

谢谢,

纳文

最佳答案

一些共同点:

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

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

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

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

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

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

通过链接时间代码生成,Foo 可以驻留在 .cpp 中(没有 inline 声明),而 Foo(false) 将仍然是内联的,所以内联在这里只有边际效应。


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

关于c++ - 内联函数(何时插入)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com