-g 标志更改程序的运行时和编译

Posted

技术标签:

【中文标题】-g 标志更改程序的运行时和编译【英文标题】:-g flag changes runtime and compilation of program 【发布时间】:2014-05-22 13:43:19 【问题描述】:

我正在编写一个程序,尝试使用 SSE 和 AVX SIMD 指令加速 Top K 过滤算法。 我正在使用带有标志 -o3、-msse3 和 -lrt 的 icc 编译我的程序,运行时间约为 30 毫秒。但是,当我在末尾添加 -g 标志以使用 vtune 或 gdb 时,程序运行所需的时间会跳到 ~ 100 毫秒。

有人可以解释为什么会发生这种情况吗?我很困惑为什么 -g 会改变程序的编译。

【问题讨论】:

你如何衡量执行时间? 我认为是-O3(大写字母)?否则,icc 默认为 -O2,除非存在 -g,在这种情况下,它默认为 -O0。 【参考方案1】:

-g 与其他优化标志如-O3(与默认的-O0 相对)通常会增加可执行文件的大小,保留符号名称、类型信息、行号等,而不是必然会影响优化的代码。这种代码大小的增加,以及程序的符号/加载时间可能会增加。

这个额外的调试数据可以用strip [options] program剥离。

请注意,使用具有更高优化值的-g 可能会导致调试器尝试逐步执行不存在的变量 - 因为它们已被优化掉。产生令人困惑的结果。这并不是说这个功能没有用。许多代码(包)默认使用-g -O2 编译,为用户提供一些调试潜力,或在需要优化可执行文件/库时进行剥离。

【讨论】:

通常,额外的调试数据应该在文件的单独部分中(甚至可以在不同的文件中),因此它不应该真正影响运行时发生的事情。一些编译器(显然包括 icc)确实改变了一些东西,比如用 -g 保持帧指针。

以上是关于-g 标志更改程序的运行时和编译的主要内容,如果未能解决你的问题,请参考以下文章

malloc如何在编译时和运行时处理? [关闭]

编译时和运行时OC中对象的动态编译机制

运行 make 时附加编译器标志

CODEBLOCKS10.05 编译运行时 DOS窗口的中文显示为乱码?怎么解决?

.NET 3.5 运行时和 .NET 4 运行时兼容性

关于运行osgi插件时和运行环境相关的问题