我已经在各种语言中担任了13年的软件工程师,尽管我现在正在进入C和后来的C++.当我正在学习C时,我正在使用GCC编译器来编译我的程序,我想知道是否有使用-O3或其他优化标志的问题.如果没有测试编译的代码,或者在交叉编译期间,我的软件可能会破坏我无法捕获的方式,我可能会无意中混淆了某个不同的平台.
在我盲目地打开这些选项之前,我想知道我能期待什么.此外,由于-Ofast打开了不符合标准的标志,我倾向于不使用它.在我的假设中,我是否正确--Ofast很可能会产生"副作用?"
在发布此问题之前,我已经浏览了https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html.
唯一的缺点-O3
应该是无法在调试器中遵循代码.
使用-Ofast
会影响某些浮点运算导致舍入错误,但除非您运行特定的长浮点计算链,否则您不太可能注意到.
破坏的代码(带有错误指针的代码或具有未定义行为的语句)可能在不同的优化级别上表现不同 - 许多程序员的第一反应是责怪编译器 - 启用所有警告并修复它们通常会有所帮助.
重要的是要记住几乎所有编译器优化都是启发式的.换句话说,"optmization"只是试图使你的程序更"理想",但它可能会产生相反的效果.只是因为-O3
它应该比它更好-O2
,而且-O2
应该更好-O1
- 这并不意味着它实际上总是如何运作.
有时,-O3
与使用-O2
或生成的版本相比,启用"优化" 可能实际上会降低程序速度-O1
.您应该尝试不同级别的优化,以查看哪种方法最适合您的特定代码.如果您真的想要对其进行微调,您甚至可以打开和关闭各个选项.
所以简而言之,使用起来可能会有缺点-O3
.我个人观察到我写的很多内容-O2
比使用的更好-O3
- 但这确实是程序特定的.
仅供参考,这是另一个问题,问为什么-O2
给出比-O3
特定程序更好的结果:gcc优化标志-O3使代码慢于-O2