我注意到在 QT Creator 中,发布版本的默认优化级别为-O2
。我想知道:为什么不-O3
?我在这里读到 Stack Overflow 它可能是危险的或“bug暴露”,但那些被认为风险大于有用的优化标志是什么?为什么?
优化级别3标记(在 GCC 上):
-fgcse-after-reload
-finline-functions
-fipa-cp-clone
-fpredictive-commoning
-ftree-vectorize
-funswitch-loops
答案 0 :(得分:4)
除了编译器错误,这可能是一个神话。它是-Ofast
风险的选项,因为它甚至不能保证符合标准的程序不会中断。
正如一个实际的例子,这里是Android开放源项目(AOSP)内的快速搜索库,没有特别的顺序 - 这可能已经足够了真正的生产代码库" - 使用-O3
:
cblas,openssh,libmpeg2,libavc,lvvm:MCJIT,jpeg,zlib,lz4,regex-re2,libpng,libutf,(及更多)
AOSP中的其他代码只是尝试优化大小(仍然是Android),因此明确使用-Os
。但是大部分代码仍然使用所有这些库 - 性能比尺寸更重要。另请注意,正确性可能是一个大问题,特别是对于openssh
之类的问题,这是上面偶然提到的。
请记住,程序员总是倾向于对优化代码更加怀疑。如果您没有开始编写符合标准的代码,并深入研究未定义的& amp;未指明的行为,理论上没有什么可以阻止编译器在不同的配置(例如优化级别)之间生成不同的结果。
因此,当您主要在一个特定级别(调试)上完成工作时,您倾向于将其作为基本参考点,然后,当您切换时,很容易简单地责怪优化器 - 就其本身而言,与我们自己的代码不同,它可能会做很多事情以保持符合标准。
答案 1 :(得分:2)
评论中优秀链接的摘要:-O2
通常比较高优化级别更受欢迎,原因如下:
优化程序错误并非闻所未闻,但大多数情况下,真正的原因是源代码中的未定义行为。另一方面,我记得一个15岁以上的(商业)编译器,它充满了优化错误,并且在一个实例中甚至成功地修复了#34;一个错误的计划。
关于优化级别之间的速度差异:SunCC的文档读取类似" -O4通常比-O3快,-O3通常比-O2快。但有时候--O2击败所有其他人。"。根据我的经验,-O2
通常更快,而不仅仅是有时。