(这是一个关于gcc和clang的问题,但可能适用于其他编译器。)
如果我编译我的C或C++代码,并使用-g开关生成调试信息,这本身就会以任何方式降低编译程序的性能……
-O0)?-O3)?备注:--我不是指必须解析/加载可执行文件的性能损失,因为额外的内容更大;我指的是运行的代码。
发布于 2016-08-30 09:09:42
我不认为有任何表现上的差异。实际上,生成的代码是相同的,根据文档-g,-O可以使用这里。此外,调试符号不是写入代码,而是写入另一个称为“调试部分”的部分,它甚至没有在运行时加载(仅由调试器加载)。
-g不会更改运行的优化或生成的代码。这是gcc的政策,正如所述的这里
然而,不妨指出,同一份文件指出:
优化代码所采用的快捷方式有时可能令人惊讶:您声明的某些变量可能根本不存在;控制流可能会短暂地移到您没有预料到的地方;有些语句可能不会执行,因为它们计算常量结果或它们的值已经在手边;一些语句可能会在不同的地方执行,因为它们已经从循环中移出了。不过,可以调试优化的输出。这使得对可能有bug的程序使用优化器是合理的。
因此,最终调试永远不会影响您的优化,但相反的是,使用-O3可能会降低调试信息的级别(例如,删除无用的变量)。
请注意,在这种情况下使用-Og (如声明的这里)可能更好,因为它会:
优化调试经验。-Og支持不影响调试的优化。它应该是标准编辑编译调试周期的最优选择,在保持快速编译的同时提供合理的优化水平和良好的调试经验。
然而,这将影响性能,因为一些会干扰调试的优化通过将不会被完成。
编辑:
链接和引号回答您的问题,因为gcc.It可能不适用于其他编译器,如clang。不过,我也为clang找到了一些文档。例如,这里
基本上,调试信息允许您使用“-O0-g”编译程序并获得完整的调试信息,允许您在程序从调试器执行时任意修改该程序。使用“-O3-g”编译一个程序将为您提供始终可用和准确的完整调试信息(例如,尽管尾部调用消除和内联,您仍能得到准确的堆栈跟踪),但您可能会失去修改程序和调用程序中优化的函数的能力,或者完全消失。
发布于 2016-08-30 09:25:07
-g标志将调试信息添加到二进制文件中。这存在于可执行文件的一个单独部分(.stab和.stabstr)中,该部分来自.text CPU运行位。在调试器之外运行时,操作系统加载程序不会加载调试部分。还可以使用strip实用程序轻松地删除调试信息,生成与没有-g标志的编译二进制文件相同的二进制文件。
然而,通常情况下,当您想调试内容时,您将在没有优化和NDEBUG预处理器宏的情况下编译。但是,这些事情不受-g标志的控制。
发布于 2016-08-30 09:00:12
如果在调试器之外运行它,将不会对性能造成任何影响。调试符号是用来帮助调试的。在这两种情况下,生成的代码应该是相同的。
https://stackoverflow.com/questions/39222698
复制相似问题