(这是一个关于 gcc 和 clang 的问题,但可能适用于其他编译器。)
如果我编译我的 C 或 C++ 代码,并使用-g
开关,这本身是否会以任何方式降低编译程序的性能......
- 具有最小的优化(
-O0
)?
- 具有最大优化(
-O3
)?
Note:我并不是指必须解析/加载可执行文件的性能损失,由于额外的内容,性能损失更大;我的意思是运行的代码。
我不认为有任何性能差异。实际上生成的代码是相同的并且-g
可以与-O
根据文档here https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html。此外,调试符号不会写入代码中,而是写入另一个称为“调试部分”的部分,该部分甚至不会在运行时加载(仅由调试器加载)
-g
不会改变运行的优化或生成的代码。
这是海湾合作委员会政策所述here https://gcc.gnu.org/ml/gcc-help/2005-03/msg00034.html
然而,值得注意的是,相同的文档指出:
优化代码所采用的快捷方式有时可能会令人惊讶:
您声明的某些变量可能根本不存在;控制流可以
短暂移动到您意想不到的地方;有些陈述可能不是
执行是因为它们计算恒定的结果或者它们的值是
已经在手边;有些语句可能在不同的地方执行
因为它们已被移出循环。尽管如此,还是有可能的
调试优化输出。这使得合理使用
针对可能存在错误的程序进行优化。
所以最终调试永远不会损害你的优化,但相反的是错误的并且使用-O3
可能会降低您的调试信息(例如通过删除无用的变量)。
请注意,在这种情况下使用可能会更好-Og
(就像声明的那样here https://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Optimize-Options.html#index-Og-737)因为它将:
优化调试体验。 -Og 启用不支持的优化
干扰调试。应该是优化级别
标准编辑-编译-调试周期的选择,提供
合理的优化水平,同时保持快速编译
以及良好的调试体验。
然而,这会影响性能,因为一些会干扰调试的优化过程将无法完成。
Edit:
链接和引用回答了您的问题gcc
.它可能不适用于其他编译器,例如clang
。
不过我也找到了一些文档clang
。
例如here http://llvm.org/docs/SourceLevelDebugging.html#id10:
基本上,调试信息允许您使用以下命令编译程序
“-O0 -g”并获取完整的调试信息,让您随心所欲
当程序从调试器执行时修改程序。编译程序
使用“-O3 -g”为您提供始终可用的完整调试信息
可供阅读且准确(例如,您可以获得准确的堆栈
尽管有尾调用消除和内联,但您可能会丢失
修改程序和调用函数的能力
从程序中优化,或完全内联。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)