ein*_*ica 15 c c++ gcc clang debug-information
(这是关于gcc和clang的问题,但可能适用于其他编译器.)
如果我编译我的C或C++代码,并使用生成调试信息-g开关,这是否本身降解以任何方式编译的程序的性能...(1)用最小优化(-O0)?(2.)最大化优化(-O3)?
注意:我并不是说必须解析/加载可执行文件的性能损失,由于额外的内容,这可能会更大; 我指的是运行的代码.
LBe*_*Bes 10
我认为没有任何性能差异.实际上,生成的代码将是相同的,-g并且可以-O根据此处的文档使用.此外,调试符号不会写入代码,而是写入另一个称为"调试部分"的部分,该部分甚至不在运行时加载(仅由调试器加载)
-g不会更改运行的优化或生成的代码.这是gcc的政策规定在这里
但是,注意相同的文档说明:
优化代码所采用的快捷方式有时可能会令人惊讶:您声明的某些变量可能根本不存在; 控制流可能会短暂地移动到你没想到的地方; 某些语句可能无法执行,因为它们计算的结果不变或者它们的值已经存在; 一些语句可能在不同的地方执行,因为它们已被移出循环.然而,可以调试优化的输出.这使得将优化程序用于可能存在错误的程序是合理的.
所以最后调试永远不会损害你的优化,但相反的是假的,使用-O3可能会降低你的调试信息(例如删除无用的变量).
请注意,可能在这种情况下使用会更好-Og(如说在这里),因为它会:
优化调试体验.-Og启用不会干扰调试的优化.它应该是标准编辑 - 编译 - 调试周期的优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验.
但是这会影响性能,因为一些会干扰调试的优化过程将无法完成.
编辑:
链接和引用可以回答您的问题.gcc它可能不适用于其他编译器,例如clang.但是我也找到了一些文档clang.比如这里:
基本上,调试信息,您可以编译"-O0 -g"的节目,并获得完整的调试信息,允许它从一个调试器将执行您随意修改程序.使用"-O3 -g"编译程序可以为您提供始终可用且准确读取的完整调试信息(例如,尽管尾部调用消除和内联,您仍可获得准确的堆栈跟踪),但您可能无法修改程序和调用函数,在程序中优化,或完全内联.