如何强制 gcc 内联函数?

__attribute__((always_inline))是否强制函数由 gcc 内联?

78790 次浏览

是的。它将内联函数而不管任何其他选项设置。参见 给你

是的。

总是内联的

通常,除非指定了优化,否则函数不会内联。对于内联声明的函数,即使没有指定优化级别,此属性也会内联函数。

会的,但这不一定是个好主意。

根据 Gcc 优化选项文档,您可以使用参数调优内联:

-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag
allows coarse control of this limit. n is the size of functions that can be
inlined in number of  pseudo instructions.


Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some
of these parameters as follows:


max-inline-insns-single is set to n/2.
max-inline-insns-auto is set to n/2.

我建议阅读更多关于内联的所有参数的详细信息,并适当地设置它们。

应该的。我很喜欢手动内联。当然,过度使用是件坏事。但是通常在优化代码的时候,会有一两个函数需要内联,否则性能就会大打折扣。而且坦率地说,根据我的经验,C 编译器在使用 inline 关键字时通常会执行 没有内联这些函数。

我非常愿意让编译器内联我的大部分代码。我真正关心的只是那些至关重要的案子。人们常说“编译器在这方面做得很好”我想看看证据。到目前为止,我已经看到了一个 C 编译器内联了一段重要的代码,我告诉它没有使用某种强制的内联语法(__forceinline对 msvc __attribute__((always_inline))对 gcc)。

也可以使用 __always_inline。我已经在 GCC 4.8.1的 C + + 成员函数中使用了它。但在海湾合作委员会的文件中找不到一个很好的解释。

实际上答案是“不”。这意味着即使禁用了优化,该函数仍然是内联的候选函数。

我想在这里补充的是,我有一个 SIMD 数学库,其中内联对于性能是绝对关键的。最初,我将所有函数都设置为内联,但反汇编表明,即使对于最琐碎的操作符,它也会决定实际调用函数。MSVC 和 Clang 都显示了这一点,并打开了所有优化标志。

我按照 SO 中其他文章的建议做了,并为 MSVC 添加了 __forceinline,为所有其他编译器添加了 __attribute__((always_inline))。在从基本乘法到正弦运算的各种紧循环中,性能一致提高了25-35% 。

我不明白为什么内联这么困难(也许模板化代码更困难?)但底线是: 有非常有效的手动内联用例,并获得巨大的加速。

如果你好奇,这就是我实现它的地方