我最近检查了一些在这个领域非常熟练的作者制作的Makefile(编程等)。这些makefile是用于在linux系统上使用gcc编译器编译的程序。
在其中一些我找到了" -g"包含CCFLAGS中的标志和LDFLAGS选项,即使在非调试目标中也是如此。我想知道它的作用,并发现它为代码添加了一些基本的调试信息。
我想知道对性能的负面影响是什么?我应该更好地从我自己的非调试目标中删除它们,还是在没有实际使用调试器或分析器的情况下,负面影响可以忽略不计?
答案 0 :(得分:1)
-g
参数本身不应对程序的性能产生负面影响:
GCC允许您将-g与-O一起使用。通过优化采取的快捷方式 代码可能偶尔产生令人惊讶的结果:一些变量你 声明可能根本不存在;控制流可能会短暂地移动到哪里 你没想到的;某些陈述可能无法执行,因为 他们计算出不变的结果,或者他们的价值已经存在; 有些陈述可能会在不同的地方执行,因为它们是 走出了循环。
(见https://gcc.gnu.org/onlinedocs/gcc-4.4.6/gcc/Debugging-Options.html#Debugging-Options)
所以你可以把-g
和-O
结合起来,尽管应该警告你上面提到的奇怪事情可能会发生。因此,除非您尝试在客户站点调试代码,否则将释放代码与调试符号组合在一起是没有意义的。但是当你这样做时,你可能没有最佳的调试经验。
但请记住,调试可以大大增加程序的文件大小。
如果存在任何副作用,您只能将其与您的实施进行对比,您无法将其他人获得的知识转移到您的代码/算法中。