2009-10-26 45 views
25

编译C++代码时,GCC是否曾尝试通过选择内联没有标记为inline关键字的函数来优化速度?GCC内联C++函数没有“内联”关键字吗?

+10

根据规范,C++中的'inline'关键字与编译器优化没有任何关系。关键字只是意味着链接器应该会看到该函数的多个定义。这恰好使内联*优化变得更容易(因为可以在多个翻译单元中使整个定义可见),但是这样做尽可能接近。编译器可以内联未标记为“inline”的函数,并且标记为“inline”的函数不一定由编译器内联。 – jalf 2009-10-26 21:43:25

+2

请注意,在类定义内部定义的方法(即在'{...};'之间')默认为'inline',即使没有关键字。 – MSalters 2009-10-27 09:43:51

回答

31

是的。任何编译器都可以自由地内联任何函数,只要它认为它是一个好主意。海湾合作委员会也这样做。

在-O2优化级别上,内联是在编译器认为值得这样做的时候完成的(使用试探法)如果它不会增加代码的大小。在-O3中,只要编译器认为它值得做,就会完成,无论它是否会增加代码的大小。此外,在所有优化级别(即启用优化)中,仅调用一次的静态函数被内联。

+0

GCC说: '-finline-functions'“考虑内联的所有函数,即使它们没有声明为内联。”我推断,即使使代码尺寸变大,用inline声明的函数也会被考虑用于内联?许多人声称从'inline'到编译器的提示已经过时了,但这意味着'-O2'提示不会被废弃,因为它只会内联使得代码更大的函数,如果他们有'inline'关键字的话。但是' -O3'它会过时(我意味着提示......“inline”关键字有其他目的)。 – 2015-12-28 16:29:44

+1

我无法创建一个大的函数来用'-O2'来内联。我创建的与-O3内联的每个功能也都与-O2一起内联。关于'-finline-small-function'的GCC说:“当它们的主体小于预期的函数调用代码时,将函数集成到它们的调用者中(所以程序的整体尺寸变得更小)”。但是,即使使用-O2来查看程序集,它显然会使代码更大。你有没有一个例子O3内联但O2不? – 2015-12-28 16:55:06

+0

@AnT如何防止编译器内联仅调用一次的函数。 – bharath 2018-01-19 10:36:43

7

是的,特别是如果您启用了高级别的优化。

有一个标志,你可以提供给编译器来禁用它:-fno-inline-functions。

+2

实际上,-fno-inline-functions禁止自动内联,-fno-inline抑制所有内联(来源:http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks 2009-10-26 17:58:35

+0

好的,我会根据你的评论进行更新,谢谢你的回复。 – Marcin 2009-10-26 18:02:06

3

如果使用'-finline-functions'或'-O3',它会内联函数。你也可以使用'-finline_limit = N'来调整它的内联。

1

“-O3 此选项打开更昂贵的优化,如内联函数

+0

它们是昂贵的,因为该功能本质上是重复的,牺牲了内存的速度。 – 2009-10-26 17:53:35

+1

@ Ape-in​​ago:这取决于...对于像运算符和访问器这样的小型通用函数,内联版本通常比较廉价,因为内联函数的指令比在函数调用周围保存和恢复寄存器要少。 – Adisak 2009-10-26 21:58:06

+0

*潜在的昂贵* – 2009-11-18 14:48:38

1

是的,确实如此,但它也将产生非内联功能体为非staticinline功能,因为这是来自其他翻译单元的呼叫所需的功能。

对于inline函数,如果函数在任何特定的翻译单元中使用,则无法提供函数体是错误的,所以这不是问题。