首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用-g编译本身会降低性能吗?

用-g编译本身会降低性能吗?
EN

Stack Overflow用户
提问于 2016-08-30 08:42:55
回答 3查看 4.8K关注 0票数 23

(这是一个关于gcc和clang的问题,但可能适用于其他编译器。)

如果我编译我的C或C++代码,并使用-g开关生成调试信息,这本身就会以任何方式降低编译程序的性能……

  1. 最小优化(-O0)?
  2. 最大优化(-O3)?

备注:--我不是指必须解析/加载可执行文件的性能损失,因为额外的内容更大;我指的是运行的代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-30 09:09:42

我不认为有任何表现上的差异。实际上,生成的代码是相同的,根据文档-g-O可以使用这里。此外,调试符号不是写入代码,而是写入另一个称为“调试部分”的部分,它甚至没有在运行时加载(仅由调试器加载)。

-g不会更改运行的优化或生成的代码。这是gcc的政策,正如所述的这里

然而,不妨指出,同一份文件指出:

优化代码所采用的快捷方式有时可能令人惊讶:您声明的某些变量可能根本不存在;控制流可能会短暂地移到您没有预料到的地方;有些语句可能不会执行,因为它们计算常量结果或它们的值已经在手边;一些语句可能会在不同的地方执行,因为它们已经从循环中移出了。不过,可以调试优化的输出。这使得对可能有bug的程序使用优化器是合理的。

因此,最终调试永远不会影响您的优化,但相反的是,使用-O3可能会降低调试信息的级别(例如,删除无用的变量)。

请注意,在这种情况下使用-Og (如声明的这里)可能更好,因为它会:

优化调试经验。-Og支持不影响调试的优化。它应该是标准编辑编译调试周期的最优选择,在保持快速编译的同时提供合理的优化水平和良好的调试经验。

然而,这将影响性能,因为一些会干扰调试的优化通过将不会被完成。

编辑:

链接和引号回答您的问题,因为gcc.It可能不适用于其他编译器,如clang。不过,我也为clang找到了一些文档。例如,这里

基本上,调试信息允许您使用“-O0-g”编译程序并获得完整的调试信息,允许您在程序从调试器执行时任意修改该程序。使用“-O3-g”编译一个程序将为您提供始终可用和准确的完整调试信息(例如,尽管尾部调用消除和内联,您仍能得到准确的堆栈跟踪),但您可能会失去修改程序和调用程序中优化的函数的能力,或者完全消失。

票数 20
EN

Stack Overflow用户

发布于 2016-08-30 09:25:07

-g标志将调试信息添加到二进制文件中。这存在于可执行文件的一个单独部分(.stab.stabstr)中,该部分来自.text CPU运行位。在调试器之外运行时,操作系统加载程序不会加载调试部分。还可以使用strip实用程序轻松地删除调试信息,生成与没有-g标志的编译二进制文件相同的二进制文件。

然而,通常情况下,当您想调试内容时,您将在没有优化和NDEBUG预处理器宏的情况下编译。但是,这些事情不受-g标志的控制。

票数 4
EN

Stack Overflow用户

发布于 2016-08-30 09:00:12

如果在调试器之外运行它,将不会对性能造成任何影响。调试符号是用来帮助调试的。在这两种情况下,生成的代码应该是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39222698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档