编译C++代码时,GCC是否曾尝试通过选择内联没有标记为inline
关键字的函数来优化速度?GCC内联C++函数没有“内联”关键字吗?
回答
是的。任何编译器都可以自由地内联任何函数,只要它认为它是一个好主意。海湾合作委员会也这样做。
在-O2优化级别上,内联是在编译器认为值得这样做的时候完成的(使用试探法)和如果它不会增加代码的大小。在-O3中,只要编译器认为它值得做,就会完成,无论它是否会增加代码的大小。此外,在所有优化级别(即启用优化)中,仅调用一次的静态函数被内联。
GCC说: '-finline-functions'“考虑内联的所有函数,即使它们没有声明为内联。”我推断,即使使代码尺寸变大,用inline声明的函数也会被考虑用于内联?许多人声称从'inline'到编译器的提示已经过时了,但这意味着'-O2'提示不会被废弃,因为它只会内联使得代码更大的函数,如果他们有'inline'关键字的话。但是' -O3'它会过时(我意味着提示......“inline”关键字有其他目的)。 – 2015-12-28 16:29:44
我无法创建一个大的函数来用'-O2'来内联。我创建的与-O3内联的每个功能也都与-O2一起内联。关于'-finline-small-function'的GCC说:“当它们的主体小于预期的函数调用代码时,将函数集成到它们的调用者中(所以程序的整体尺寸变得更小)”。但是,即使使用-O2来查看程序集,它显然会使代码更大。你有没有一个例子O3内联但O2不? – 2015-12-28 16:55:06
@AnT如何防止编译器内联仅调用一次的函数。 – bharath 2018-01-19 10:36:43
是的,特别是如果您启用了高级别的优化。
有一个标志,你可以提供给编译器来禁用它:-fno-inline-functions。
实际上,-fno-inline-functions禁止自动内联,-fno-inline抑制所有内联(来源:http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks 2009-10-26 17:58:35
好的,我会根据你的评论进行更新,谢谢你的回复。 – Marcin 2009-10-26 18:02:06
如果使用'-finline-functions'或'-O3',它会内联函数。你也可以使用'-finline_limit = N'来调整它的内联。
“-O3 此选项打开更昂贵的优化,如内联函数”
它们是昂贵的,因为该功能本质上是重复的,牺牲了内存的速度。 – 2009-10-26 17:53:35
@ Ape-inago:这取决于...对于像运算符和访问器这样的小型通用函数,内联版本通常比较廉价,因为内联函数的指令比在函数调用周围保存和恢复寄存器要少。 – Adisak 2009-10-26 21:58:06
*潜在的昂贵* – 2009-11-18 14:48:38
是的,确实如此,但它也将产生非内联功能体为非static
非inline
功能,因为这是来自其他翻译单元的呼叫所需的功能。
对于inline
函数,如果函数在任何特定的翻译单元中使用,则无法提供函数体是错误的,所以这不是问题。
- 1. C,内联函数和GCC
- 2. 推荐gcc内联函数
- 3. C/C++编译器可以内联malloc()内联函数吗?
- 4. 为什么gcc没有为这个函数决定内联或者不内联?
- 5. C++内联函数
- 6. Django - 内联(没有外键)
- 7. C++的gcc串内联
- 8. GCC预处理器内联函数名
- 9. 内联函数在其他内联函数用C
- 10. GCC内联汇编中的C数组?
- 11. C++函数指针内联
- 12. C++中的内联函数
- 13. C:指针内联函数
- 14. C++中的内联函数
- 15. C++隐含内联函数
- 16. C++内联函数原型
- 17. c中的内联函数
- 18. 内联函数
- 19. 内联函数
- 20. 内联函数
- 21. 在模板中使用内联关键字有意义吗?
- 22. 联动的内联函数
- 23. C++链接器会自动内联函数(没有“inline”关键字,没有在头文件中实现)?
- 24. 我必须重申对函数实现内联关键字
- 25. 为什么内联函数需要static关键字?
- 26. GCC汇编内联:与只有内联汇编代码
- 27. 内联函数的函数指针C
- 28. g ++/gcc在展开递归内联函数时有多有效?
- 29. C++异常,GCC和“内联函数”标志
- 30. 有没有办法在c#中强制函数内联?
根据规范,C++中的'inline'关键字与编译器优化没有任何关系。关键字只是意味着链接器应该会看到该函数的多个定义。这恰好使内联*优化变得更容易(因为可以在多个翻译单元中使整个定义可见),但是这样做尽可能接近。编译器可以内联未标记为“inline”的函数,并且标记为“inline”的函数不一定由编译器内联。 – jalf 2009-10-26 21:43:25
请注意,在类定义内部定义的方法(即在'{...};'之间')默认为'inline',即使没有关键字。 – MSalters 2009-10-27 09:43:51