【发布时间】:2016-03-18 17:57:53
【问题描述】:
我从事各种语言的软件工程师已有 13 年了,但我现在才刚刚进入 C 和后来的 C++ 领域。当我学习 C 时,我正在使用 GCC 编译器来编译我的程序,我想知道使用 -O3 或其他优化标志是否有任何问题。是否有可能我的软件会出现在不测试编译代码的情况下无法捕捉到的问题,或者在交叉编译期间,我可能会无意中为不同的平台搞砸了。
在我盲目地启用这些选项之前,我想知道我能期待什么。此外,当 -Ofast 打开不符合标准的标志时,我倾向于不使用它。我的假设是否正确,即 -Ofast 很可能会产生“副作用”?
在发布这个问题之前,我已经浏览了https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html。
【问题讨论】:
-
我认为是 -O2 的里程比 -O3 多很多。我建议您确保测试二进制文件...
-
无论如何你都应该测试所有的二进制文件...
-
@dwelch 你是对的。在我写了关于测试的内容之后,我意识到我无法在它编译之前对其进行测试。我想我已经习惯了可以避开公共界面的脚本语言测试。
-
如果你利用未定义的行为,你很可能会得到一些惊喜。对于兼容代码:代码的行为不得不同。但是,如果没有代码审查,您的问题将无法回答(这与 SO 无关)。
-
如果你还想调试你的程序,你应该使用
-Og。但是,如果您的代码因优化而中断,您很可能在下一个版本的 gcc 或使用不同的架构、编译器、添加另一行代码等时出现错误行为。依赖 UB 总是招致灾难。