如何强制gcc内联函数?

时间:2011-12-05 05:17:51

标签: gcc inline compiler-flags

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

8 个答案:

答案 0 :(得分:42)

来自documentation

  

always_inline

     

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

答案 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)

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