GCC 4.8引入了一个新的优化级别:-Og
,最好两个世界都有。
-Og
优化调试体验。-Og启用不会干扰调试的优化。它应该是标准编译调试周期的首选优化级别,既可以提供合理的优化水平,又可以保持快速编译和良好的调试体验。
这样一来就可以进行一些优化,从而获得更好的性能、更好的可能未初始化变量的检测,并且还可以在GDB中逐步执行程序,而不需要在函数之间来回跳转。
-Og
的构建速度比 -O0
慢了20-25%。这是GCC的一个很好的补充,但基于编译时间的惩罚,我不认为它应该自动成为首选级别。 - Josh Kelley-g -O0
进行构建时,调试最容易,但代码运行非常缓慢。-g -O1
进行构建时,您将开始观察优化效果。尝试进入函数时,会发现它已被内联等。-g -O2
,您会注意到很多优化效果。打印变量时会出现“optimized out”,在代码中会出现意外跳转等。-g -O3
,您会看到相同的症状,但更频繁。-O3
的级别,所以这就是终点。-O3
执行的转换的人很少有麻烦来调试该代码(您始终可以查看汇编代码,找出要使用的变量实际位于何处,然后从那里开始)。但对于普通人来说,通常很难调试-O2
代码。 optimized out
实例数的工作,但尚未完成。-O3
,还有更高的-Ofast
。 - Hi-Angel-g
也有不同的级别。 -g
相当于 -g2
,例如 -g3
可以添加宏扩展。 - Lekensteyn-g
)和优化级别(-O*
系列)是独立的问题。 -g
标志基本上指示 gcc 在编译时包括调试符号(以及与代码行号对应的一些提示)。 它可以应用于任何优化级别。