如何强制gcc内联函数?

如何强制gcc内联函数?,gcc,inline,compiler-flags,Gcc,Inline,Compiler Flags,\uuuu属性(总是内联))是否强制gcc内联函数?是。它将内联函数,而不考虑任何其他选项集。请参阅。是 从 从 始终在线 通常,除非指定了优化,否则函数不会内联。对于内联声明的函数,即使未指定优化级别,该属性也会内联函数 是的,会的。这并不意味着这是一个好主意。根据文档,您可以使用参数调整内联: -finline-limit=n By default, GCC limits the size of functions that can be inlined. This flag allo

\uuuu属性(总是内联))是否强制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编译器不使用某种强制内联语法(
\uu forceinline
在msvc上
\uu属性((always\u inline))
就内联我告诉它的一段重要代码。

人们也可以使用
\u always\u inline
。我已经为GCC 4.81.使用了C++成员函数。但是在GCC文档中找不到很好的解释。

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

我想在这里补充一点,我有一个SIMD数学库,其中内联对性能至关重要。最初我将所有函数都设置为inline,但反汇编显示,即使对于最简单的运算符,它也会决定实际调用该函数。MSVC和Clang都显示了这一点,所有优化标志都打开了

我按照SO中其他帖子的建议做了,并为MSVC添加了
\uu forceinline
,为所有其他编译器添加了
\uu属性((始终为inline))
。在从基本乘法到正弦运算的各种紧循环中,性能持续提高25-35%

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


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

GCC使用代码大小作为启发式,以确定是否将某些内容内联。我有一个网络/序列化库,由于代码大小的原因,默认情况下它不会内联函数。我做了内联,它在基准测试中提高了30%的性能。内联的一个原因是,如果您在编译时知道值(传入常量),并且希望展平函数。例如,如果一个函数在两个具有不同静态参数的不同位置使用,则内联可以减少分支。这是用于内环中的函数。另一个例子原因:我做音频DSP编码。有时我不能使用调试器,因为非内联函数调用(来自许多访问器函数和东西)变得非常昂贵,以至于代码不能足够快地为缓冲区提供服务。。。您需要同时指定
inline
\uuuuuu属性((始终为inline))
。我刚刚用GCC在Android NDK r10d上测试了这个。也许不是一个标准环境,但从我所读到的内容来看,这一要求对于所有平台都是一样的。另一个例子(不是基于优化的):当为微控制器编写函数以在运行时写入其内部闪存时,我需要在开始写入之前复制对闪存进行实际写入并写入ram的例程,因为不允许同时读取和写入。如果这个例程调用任何非内联函数,那么我必须将所有依赖项复制到ram中,并动态调整任何跳转地址,这比强制内联解决方案要复杂得多。强制内联提供了类似于C++中至少部分非类型模板参数的功能:当您知道需要为参数的每个值编译新函数时。您可以尝试使用宏来获得此功能,但强制内联通常更干净(尽管可移植性较差)。内联函数并不总能提高性能(例如缓存问题)例如,我有时使用它的一个很好的理由是:在开发音频DSP应用程序时,有时调试版本的处理速度无法跟上采样率。通过强制诸如访问器函数之类的东西内联,我能够进行测试和调试。更正:这并不一定意味着这是一个好主意。有时候是这样。我很欣赏msvc和gcc的比较!我同意,但我更倾向于内联。我在数千个函数上使用了_forceinline,节省了600个服务器场的20%。假设编译器将做出最佳决策,WRT内联就是不正确的。编译器正在猜测。不管有没有受过教育的猜测,这仍然是一种猜测。编译器不知道您编写函数是为了优化由常量参数组成的表达式。使用gcc,您还需要明确指定
inline
\uuuu属性\uuuuuu((始终\u inline))inline YourFunc(…
),否则您将得到
警告:始终\u inline函数可能不可内联[-Wattributes]
,但最上面的答案有一个直接的引语,特别指出“此属性内联函数”。我看不到任何“候选者”的引用。您的来源是什么?对于
inline
关键字是这样的,而不是
always\u inline
属性,请参见模板函数代码倾向于不内联,而是ev