我如何强制gcc内联一个函数?

__attribute__((always_inline))强制一个函数被gcc内联?

是。

从文档

always_inline

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

是的,它会。 这并不意味着这是一个好主意。

这应该。 我是手动内联的忠实粉丝。 当然,过度使用这是一件坏事。 但通常在优化代码时,会有一两个函数需要内联或性能下降。 坦率地说,根据我的经验,当使用inline关键字时,C编译器通常不会内联这些函数。

我非常乐意让编译器为我插入大部分代码。 只有那么几个绝对重要的案例我才真正关心。 人们说“编译器在这方面做得很好”。 我想看看这个certificate。 到目前为止,我从来没有见过一个C编译器内联一个我告诉它的重要代码片段,而不使用某种强制内联语法(在gcc上的msvc __attribute__((always_inline))上的__forceinline )。

根据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. 

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

是。 它将内联该function,而不pipe其他任何选项设置。 看到这里 。

我想在这里添加一个SIMDmath库,其中内联对于性能来说是绝对关键的。 最初我将所有函数设置为内联,但反汇编表明,即使对于最微不足道的操作符,它也会决定实际调用该函数。 MSVC和Clang都显示了这一点,所有的优化标志。

我按照SO中的其他post所build议的__attribute__((always_inline))为所有其他编译器添加了__forceinline for MSVC和__attribute__((always_inline)) 。 在各种紧密的循环中,性能一直在25-35%的提高,从基本的乘法到正弦的操作。

我没有弄清楚为什么他们有这么难的内联(也许模板代码更难?),但底线是:有非常有效的用例手动内联和巨大的加速获得。

如果你好奇,这是我实现它的地方。 https://github.com/redorav/hlslpp

也可以使用__always_inline 。 我一直在使用GCC 4.8.1的C ++成员函数。 但在GCC doc中找不到一个好的解释。

其实答案是“不”。 所有这一切意味着即使禁用了优化,该函数也是内联的候选人。