__attribute__((always_inline))
是否强制gcc内联函数?
答案 0 :(得分:42)
答案 1 :(得分:27)
它应该。我是手动内联的忠实粉丝。当然,过度使用它是一件坏事。但是,在优化代码时,通常会有一两个功能,只需要内联或性能下降。坦率地说,根据我的经验,C编译器通常在使用inline关键字时 not 内联这些函数。
我非常愿意让编译器为我编写大部分代码。它只是我真正关心的那些半打左右绝对重要的案例。人们说"编译器在这方面做得很好。"我想看看那个证据。到目前为止,我从来没有看到C编译器在不使用某种强制内联语法(__forceinline
msvc __attribute__((always_inline))
的情况下内联了我告诉它的一段重要代码。在gcc上。
答案 2 :(得分:24)
是的,它会的。这并不意味着它是一个好主意。
答案 3 :(得分:11)
根据gcc optimize options文档,您可以使用参数调整内联:
-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.
我建议您详细阅读有关内联所有参数的详细信息,并进行适当的设置。
答案 4 :(得分:3)
是。无论其他任何选项集如何,它都会内联函数。请参阅here。
答案 5 :(得分:1)
我想在此添加一个SIMD数学库,其中内联对性能至关重要。最初我将所有函数设置为内联,但反汇编显示即使对于最琐碎的运算符,它也会决定实际调用该函数。 MSVC和Clang都显示了这一点,并且所有优化标志都已显示。
我按照SO中其他帖子的建议执行了操作,并为MSVC添加了__forceinline
,为所有其他编译器添加了__attribute__((always_inline))
。各种紧密回路的性能始终保持25-35%,从基本乘法到正弦。
我没弄清楚为什么他们有这么难的内联(也许模板代码更难?)但最重要的是:有非常有效的用例内联手动内容和巨大的加速。
如果你很好奇这就是我实施它的地方。 https://github.com/redorav/hlslpp
答案 6 :(得分:0)
也可以使用__always_inline
。我一直在将它用于GCC 4.8.1的C ++成员函数。但是在GCC doc中找不到一个好的解释。
答案 7 :(得分:-4)
实际上答案是“不”。这意味着即使禁用了优化,该函数也是内联的候选者。