理解 g++ 编译标志

4

我想了解每个标志对代码的影响,以理解它们的开销。我查阅了 man g++ 关于 '-g' 标志,只发现了 "生成额外的代码来写入配置文件....",但没有指明具体位置。

有没有详细的手册可以帮助我理解 -g/-p 的作用呢?


http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html - devnull
等一下,节省带宽。info gcc 也应该有所帮助。 - devnull
问题在于他们提供了这样的语句:“生成额外的代码以编写适合分析程序 prof 的配置文件信息”。但没有提供关于“哪些类型的信息适合进行分析”的信息。 - Syntax_Error
1
可能是重复的问题:gcc 的 -pg 标志如何工作? - devnull
3个回答

7
"-p选项可以生成额外的代码来编写配置文件,这将添加额外的代码。此额外代码至少包括在函数开头和结尾处的一个寄存器加载和一个函数调用,但它取决于架构。这可能会影响其他编译优化,例如寄存器可用性、内联以及实际运行代码时可能会影响高速缓存命中率/缺失率,除了执行这些额外指令的直接影响外。

-g选项本身不会添加额外的代码,只会产生调试符号,这些符号成为可执行文件的一部分,以便调试器在使用调试器时找到函数、变量等。"


+1:具体的例子,并注明这并不是绝对确定的。 - Lightness Races in Orbit
感谢您提供的信息丰富的答案。那么,我可以安全地假设随着代码中函数数量的增加,执行时间会增加吗?或者它也会随着其他参数的增加而增加吗? - Syntax_Error
1
如果您有一些代码,目前使用了3个函数,这些函数按顺序从主函数中调用1M次,并且您将代码重构为8个函数,并且所有这些函数都被调用了1M次,那么是的。如果您有更多的函数,但它们没有被调用那么多次,那么不一定。每次调用函数时,“统计计数”函数都会被调用-这取决于您的函数执行什么操作以及它们被调用的次数,这会产生多少开销。 - Mats Petersson

5
有趣的问题,如果你的起点是gcc手册,那么很难找到信息。基本上,-g标志会将额外的“调试”信息直接写入生成的目标文件(.o)和可执行文件中。这些额外的信息可以被调试器(比如gdb)用来帮助调试人员理解正在发生的事情。例如,如果你有一个变量名,它会被保留为额外的信息,这样当你使用调试器时,你可以引用你在源代码中使用的变量,而不是一些随机的内存地址,因为没有符号调试信息。调试选项在gcc手册这里中有一些解释。然而,我认为你需要一个调试介绍。所以看一下UWA的GDB介绍,以更好地理解正在发生的事情。
同样适用于性能分析数据。-p在可执行文件中添加额外信息,以便像prof这样的分析器可以跟踪软件运行情况并告诉您它花费大部分时间的位置(循环/函数等)以及程序的效率如何。 :-)
阅读相关内容:
文件中符号信息和调试信息之间存在差异。一旦开始查看链接,您将遇到符号解析。

感谢这个入门指南 :) - Syntax_Error

0
问题在于他们提供了这样的声明:“生成额外的代码以编写适用于分析程序prof的概要信息”。但是没有提供“什么类型的信息适合分析”的信息。
这被抽象化了,因为您不需要知道。
如果您认为需要知道,请检查编译器的源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接