c++ - 如果递归函数定义为内联会发生什么?

标签 c++ function inline

<分区>

Possible Duplicate:
Can a recursive function be inline?

我认为定义为内联的递归函数不会有任何效果,根本不会成为内联。因为,编译器不知道要复制多少层内联函数的代码。有什么想法吗?

最佳答案

我尝试浏览相关的 SO 问题来为您找到一个明确的现有答案,但唉......

因此,关键字 inline(或在类定义中隐式内联的成员函数)有两个作用:

  • 保证可以在不违反单一定义规则的情况下在多个翻译单元中定义函数,即在实践中,链接器不会反对多个定义。为此,函数的所有定义都必须是内联,并且它们必须相同。

  • 它作为对编译器的模糊提示,以内联机器代码以调用函数。有些调用可能是内联的,有些则不是。内联的程度可能会有所不同,编译器甚至可能会完全忽略这个提示(在实践中,g++ 倾向于遵循荒谬甚至不好的程度的提示,而 Visual C++ 更像是忽略它)。

    <

对于递归函数,如果编译器遵循函数的任何特定调用的提示,则该调用可以扩展到一级或二级或三级或任何级别的递归。这是一件困难的事情,所以不要指望它。此外,编译器自己的内联启发式可能比您的直觉更好,因为编译器对事物有更全局的看法(它知道更多),因此,总结一下:

不要将内联用于提示效果,将其用于 ODR 保证。

在你绝对确定你确实比编译器更了解的地方,在你遵守“先测量”和“不要过早优化”等原则的地方,你也许可以获得更可靠的控制通过编译器特定的语言扩展或编译指示进行内联。

干杯,

关于c++ - 如果递归函数定义为内联会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5150465/

相关文章:

c++ - 根据我对 §3.4.1/8 的解释,这段代码应该可以编译。我错过了什么?

c++ - 按字典顺序比较字符串

jquery - 如何创建无需选择器即可工作的 jQuery 函数?

javascript - 运行 JS 函数按顺序运行 onclick

css - 带显示的导航 : inline-block not centering in css?

c++ - std::thread 不是使用 Eclipse Kepler MinGW 命名空间 std 的成员

c++ - 表达式必须有类类型(学生数据库)?

c++ - C++ 中的内联函数与普通函数

c++ - 内联代码应该有多小

RubyInline - 比较字符串