我的程序在 VS2012 中在 Debug 模式和 Release 模式下运行的速度相差很大。然而,当我使用 g++ 在 linux 中运行程序时,无论我使用调试模式(使用 -g 选项)还是发布模式,速度几乎保持不变。谁能告诉我这是否是普通的?
在
gcc
(和 clang
,以及其他 C/C++ 编译器)中,调试信息和优化是独立的选项。 “发布模式”没有单一选项;你需要更准确地定义你想要什么。
-g
选项指定您想要生成调试信息。您可以更精确——可以请求调试信息的特定格式——但在正常情况下,这是没有必要的。省略 -g
不会自动启用优化。
优化由
-O
选项和大量特定优化标志控制。如果您不指定任何优化标志,则实际上不会执行任何优化。
优化有四个基本级别:
-O0 no optimizations that would affect debugging (the default)
-O or -O1 basic optimizations
-O2 more optimizations
-O3 yet more optimizations
和
-Os similar to -O2, but optimizing also for executable size.
具体标志以
-f
开头。有数百个。不过,通常您无需担心。
对于某些架构,您还可以根据目标平台进行优化(或不优化)。例如,默认的 i386 版本不会利用现代芯片的所有功能。
如果您指定除
-O0
以外的优化选项(如果您未指定任何 -O
选项,则这是默认选项),那么编译器可能会重新排序语句、将变量移动到寄存器,否则会给调试器带来困难(即进行调试的人以及他们用来帮助他们的软件)。 gdb
会尽力应对,gcc
将为gdb
提供提示来帮助它,但你可能仍然会觉得很困惑。然而,即使在优化构建中,使用 -g
构建也很常见,因为它使读取核心图像更容易。
默认情况下,debug模式在编译文件中包含debug信息,而release通常启用optimizations。所以一般来说释放模式应该更快。从名字就可以猜到了。