使用 -g 进行编译本身会降低性能吗? [复制]

2024-04-30

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

如果我编译我的 C 或 C++ 代码,并使用-g开关,这本身是否会以任何方式降低编译程序的性能......

  1. 具有最小的优化(-O0)?
  2. 具有最大优化(-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(使用前将#替换为@)

使用 -g 进行编译本身会降低性能吗? [复制] 的相关文章

随机推荐

  • 如何将 int 数组添加到共享首选项中?

    我正在尝试将 int 数组保存到共享首选项中 int myInts 1 2 3 4 SharedPreferences prefs getSharedPreferences Settings 0 SharedPreferences Edit
  • 如果在SAX中设置setNamespaceAware(true),如何获取“xmlns:XXX”属性?

    这是我的代码 path wsdlPath SAXParserFactory saxfac SAXParserFactory newInstance saxfac setNamespaceAware true saxfac setXInclu
  • 如何操作 Rust 数组的 2 个可变切片?

    我有一个函数需要对单个数组的两个部分进行操作 目的是能够建立一个 nostd 分配器 可以将更大数组的变量切片返回给调用者 并保留数组的其余部分以供将来分配 这是失败的示例代码 fn split lt a gt mut item a mut
  • 以编程方式编辑 PDF 文件

    目前我已经编写了一个Android应用程序 可以使用Android中的默认PDF查看器打开PDF文件并通过邮件发送 android 中有什么方法可以通过我的应用程序编辑 PDF 吗 None
  • 无法在 HTML 中的单选按钮之间进行选择?

    我有以下表单代码 但无法在 IE 中选择销售无线电 我可以在 Google Chrome 中同时选择两个收音机
  • 如何从 httpservletrequest 获取多方身份

    我正在尝试从 java spring 控制器调用 web 服务 下面是代码 private void storeImages MultipartHttpServletRequest multipartRequest DefaultHttpC
  • 更新 Heroku CLI 时出错:存在写锁:更新

    然而 我正在尝试更新 Heroku CLI 但没有成功 Heroku CLI 的当前版本是 heroku cli 6 15 5 1f03166 win32 x64 node v9 3 0 跑步时 heroku update 我收到以下错误
  • 如何使用 Chart.js 在标签中放置新行?

    我有一个使用 Chart js 的带有标签的数据集 我想用换行符将标签分成两行 我努力了 br and n 两者都不起作用 labels A br Waking B C D labels A nWaking B C D 第一个标签应该输出如
  • 为什么 XSS 注入需要对 & 进行转义

    OWASP 建议转义以防止 XSS 注入的五个字符是 lt gt 其中 我无法理解为什么 符号 应该被转义以及如何将其用作注入脚本的向量 有人可以举个例子 所有其他四个字符都被转义 但与号没有转义 所以会有 XSS 注入漏洞 我已经检查了另
  • 我可以从 C# 转换为 asp.Net 以在线托管应用程序吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 是否可以将 C 应用程序转换为 as
  • 甚至阻止超级管理员/dba 删除/更新表?

    我需要确保一些关键任务表永远不会被删除或编辑 唯一可能的操作是从中读取数据 并且 dba 可以添加更多行 就是这样 现在为了增加安全性 我想阻止甚至 dba 都能够删除 更改记录 所以基本上没有人可以删除或更改记录 也没有超级管理员 这些表
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • 如何制作 100% 宽度的 ASP.NET 菜单

    我正在构建一个 asp net 网站 其中需要一个水平 asp 菜单作为全屏宽度 其中有 10 个项目 每个项目的宽度为 10 请提出一个解决方案 因为当我将菜单宽度设置为 100 并且li宽度为 10 它不是全宽度的 但是 当我将菜单宽度
  • JDOM、XPath 和命名空间交互

    我在使用 XPath 表达式从 JDOM 文档中提取一些元素时遇到了非常令人沮丧的情况 这是一个示例 XML 文档 我想从文档中完全删除 ItemCost 元素 但目前无法获取 XPath 表达式来计算任何内容
  • 如何缩小 SQL Server 数据库?

    我有一个数据库大小接近1 9Gb 而MSDE2000不允许数据库超过2 0Gb 我需要缩小这个数据库 以及在不同客户端位置的许多其他类似数据库 我发现并删除了数百条或数千条被认为不需要的记录 这些记录占数据库中一些主要 最大 表的很大一部分
  • 罗伯特·吉塞克 (Robert Giesecke) 的不受管理的出口

    我正在尝试从 vb net 获取 DllExport 到非托管 c 工作 我在用着罗伯特 吉塞克 Robert Giesecke 的不受管理的出口 https sites google com site robertgiesecke Hom
  • 使用 owl:Class 前缀进行 rdflib 和 xml 序列化

    我想使用owl 我的 RDF 本体的 XML 序列化中的前缀 使用 rdflib 版本 4 1 1 不幸的是我仍然得到序列化rdf Description标签 我查看了有关将命名空间绑定到图表的答案RDFLib XML 序列化中的命名空间前
  • Python 正确解析 CSV

    我对 Python 很陌生 我想解析 csv 文件 以便它能够识别带引号的值 例如 1997年 福特 E350 超级豪华卡车 应该拆分为 1997 福特 E350 超级豪华卡车 and NOT 1997 福特 E350 超级 豪华卡车 如果
  • 可转换后:该商品与您的设备不兼容

    我使用 www apportable com 工具 免费版 将我的 Cocos2d IOS 项目转换为 Android APK 文件 经过一些代码调整后转换成功 在我的 Nexus 7 上测试 有效 已上传到 Google Play 在 A
  • 使用 -g 进行编译本身会降低性能吗? [复制]

    这个问题在这里已经有答案了 这是一个关于 gcc 和 clang 的问题 但可能适用于其他编译器 如果我编译我的 C 或 C 代码 并使用 g开关 这本身是否会以任何方式降低编译程序的性能 具有最小的优化 O0 具有最大优化 O3 Note