【问题标题】:Understanding g++ compilation flags了解 g++ 编译标志
【发布时间】:2013-06-20 11:07:07
【问题描述】:

我想知道每个标志对代码的作用以了解其开销。我检查了

man g++ 用于 '-g' 标志

只找到"Generate extra code to write profile...."

它没有指定在哪里?

他们有详细的手册来帮助我理解 -g/-p 的作用吗?

【问题讨论】:

标签: gcc g++


【解决方案1】:

“生成额外代码以写入配置文件”是-p 选项,它将添加额外代码。该额外代码的范围至少是一个寄存器加载和一个函数开始和结束时的函数调用,但它确实取决于体系结构。这可能反过来影响编译期间的其他优化,例如寄存器的可用性、内联以及实际运行代码时可能会影响缓存命中率/未命中率,以及执行这些额外指令的直接影响。

-g 选项本身并不添加额外的代码,它只是生成成为可执行文件一部分的调试符号,以便调试器在您使用调试器时能够确定函数、变量等的位置。

【讨论】:

  • +1:具体示例,并注意它绝不是死证书。
  • 感谢您提供的信息丰富的回答。那么我可以安全地假设执行时间会随着代码中函数数量的增加而增加吗?还是会随着其他参数增加?
  • 如果你有一些当前使用的代码,比如说3个函数都从main开始依次调用了1M次,然后你将代码重构为8个函数,所有这些函数都被调用了1M次,是的。如果你有更多的功能,但它们没有被多次调用,那么不一定。每次调用函数时,都会调用“统计计数”函数 - 开销的多少很大程度上取决于函数的功能以及调用次数。
【解决方案2】:

有趣的问题,如果您的出发点是 gcc 手册页,则很难找到信息 :-) 所以就这样吧。

基本上,-g 标志将额外的“调试”信息直接写入生成的目标文件 (.o) 和可执行文件。然后,调试器(例如 gdb)可以使用这些额外信息来帮助了解进行调试的人正在发生的事情。

例如,如果您有一个变量名作为额外信息保留,这样当您使用调试器时,您可以引用您在源代码中使用的变量而不是一些随机内存地址,因为符号调试信息不在那里。

调试选项有点解释in the gcc manual here

但是我认为您需要一个调试介绍。所以看看GDB introduction by UWA 以便更好地了解正在发生的事情。

分析数据也是如此。 -p 在可执行文件中添加额外信息,以便像 prof 这样的分析器可以跟踪软件的运行情况并告诉您它大部分时间花在哪里(哪些循环/函数等)以及程序的效率如何(低) . :-)

需要阅读的相关内容

文件中的符号信息和调试信息是有区别的。一旦开始查看链接,您就会遇到符号解析。

【讨论】:

  • 感谢介绍指南 :)
【解决方案3】:

问题是他们提供了这样的声明:“生成额外的代码来编写适合分析程序教授的配置文件信息”而不是提供有关“什么类型的信息适合分析”的信息。

它从你身上抽象出来,因为你不需要知道。

如果您不这么认为,请检查编译器的源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多