是否__attribute__((always_inline))
强制 gcc 内联函数?
8 回答
它应该。我是手动内联的忠实粉丝。当然,过量使用它是一件坏事。但通常在优化代码时,会有一两个函数需要内联,否则性能会下降。坦率地说,根据我的经验,C 编译器在使用 inline 关键字时通常不会内联这些函数。
我非常愿意让编译器为我内联我的大部分代码。我真正关心的只是那六个左右绝对重要的病例。人们说“编译器在这方面做得很好”。我想看看这方面的证据,拜托。到目前为止,我从未见过 C 编译器在不使用某种强制内联语法的情况下内联我告诉它的一段重要代码(在 gcc__forceinline
上的 msvc上)。__attribute__((always_inline))
是的,它会的。这并不意味着这是一个好主意。
根据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.
我建议阅读更多关于内联所有参数的详细信息,并适当地设置它们。
是的。无论设置任何其他选项,它都会内联该函数。见这里。
我想在这里补充一点,我有一个 SIMD 数学库,其中内联对性能绝对至关重要。最初我将所有函数都设置为内联,但反汇编表明,即使对于最琐碎的运算符,它也会决定实际调用该函数。MSVC 和 Clang 都显示了这一点,所有优化标志都打开了。
我按照 SO 中其他帖子中的建议做了,并__forceinline
为 MSVC 和__attribute__((always_inline))
所有其他编译器添加了内容。在从基本乘法到正弦的各种操作中,各种紧密循环的性能持续提高了 25-35%。
我不明白为什么他们很难内联(也许模板代码更难?)但底线是:手动内联有非常有效的用例,并且可以获得巨大的加速。
如果你很好奇,这就是我实现它的地方。https://github.com/redorav/hlslpp
一个也可以使用__always_inline
。我一直将它用于 GCC 4.8.1 的 C++ 成员函数。但在 GCC 文档中找不到很好的解释。
实际上答案是“不”。这意味着即使禁用了优化,该函数也是内联的候选者。