【问题标题】:Difference between __always_inline and inline__always_inline 和 inline 之间的区别
【发布时间】:2014-01-08 12:11:57
【问题描述】:

another question 上使用inline 指令有一个很好的解释

如果在头文件上使用inline__always_inline 有什么区别,谁能解释我?

而且,什么时候我更喜欢__always_inline 而不是inline,反之亦然?

【问题讨论】:

  • inline 是标准的,而 __always_inline 看起来像是仅适用于某些编译器的编译器扩展。顺便说一句inline 是对编译器的建议。不能保证它会被内联。
  • 在询问编译器特定关键字时始终指定编译器会很有帮助。

标签: c compiler-construction inline


【解决方案1】:

这里没有一个答案真正回答了何时应该使用内联而不是始终内联的问题,但答案相当简单。除非您确切地知道自己在做什么并了解内联您正在注释的函数的性能影响,否则您几乎应该始终使用内联,因为在最坏的情况下,错误的内联决策可能会使程序变得更慢,这包括内联时你不应该内联,当你应该内联时也不应该内联。一般来说,编译器在大多数情况下都非常聪明地决定了这一点,但它并不完美。如果是,就不需要 inline 关键字。的确,C 语言对于 inline 关键字的确切含义是相当深奥的,因此您应该在使用它之前阅读它,但最好将最终决定权留在是否尽可能将函数内联给编译器。

话虽如此,当您优化代码的关键部分时(如果您不关心性能,为什么要内联?),有时编译器会做出错误的决定。在这种情况下,您可以使用 noinline 或 alwaysinline 更正该行为。但在做出此决定之前,您应该始终熟悉相关功能的组装;过多的内联会增加代码大小和寄存器压力,并降低缓存局部性。太少会使代码变慢几个数量级。

【讨论】:

    【解决方案2】:

    Always inline 函数属性表示必须内联函数。 编译器尝试内联函数,而不考虑函数的特征。

    但是,如果使用内联属性,编译器不会内联函数,如果这样做会导致问题。例如,递归函数只内联一次。

    __forceinline 等价于 __always_inline。

    【讨论】:

      【解决方案3】:

      这篇文章提供了一些有用的信息: https://www.kernel.org/doc/local/inline.html

      “在 Linux 中,关键字“__always_inline”强制内联函数,而“noinline”阻止函数内联。我们不使用“inline”关键字,因为它已损坏。”

      【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2018-04-25
      • 2012-02-16
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      相关资源
      最近更新 更多