C++ 如何在发布模式下构建GCC中的优化?
我需要在“发布模式”中构建哪些具体选项,并在GCC中进行全面优化?如果有多个选项,请列出所有选项。谢谢。 没有“一刀切”——您需要了解您的应用程序、需求和优化标志,以确定二进制文件的正确子集 或者你想要的答案:C++ 如何在发布模式下构建GCC中的优化?,c++,c,gcc,g++,C++,C,Gcc,G++,我需要在“发布模式”中构建哪些具体选项,并在GCC中进行全面优化?如果有多个选项,请列出所有选项。谢谢。 没有“一刀切”——您需要了解您的应用程序、需求和优化标志,以确定二进制文件的正确子集 或者你想要的答案: -O3-O2将启用所有不需要空间/速度权衡的优化,并且往往是我看到最常用的优化-O3在速度上做了一些权衡(比如函数内联)——Os做O2 plus做了其他事情来减少代码大小。通过提高缓存使用率,这可以使事情比O3更快。(测试以确定它是否适用于您。)注意,有大量选项没有一个O开关可以接触。它
-O3-O2将启用所有不需要空间/速度权衡的优化,并且往往是我看到最常用的优化-O3在速度上做了一些权衡(比如函数内联)——Os做O2 plus做了其他事情来减少代码大小。通过提高缓存使用率,这可以使事情比O3更快。(测试以确定它是否适用于您。)注意,有大量选项没有一个O开关可以接触。它们被忽略的原因是,这通常取决于您正在编写的代码类型,或者非常依赖于体系结构 注意,gcc不像MSVC那样有“发布模式”和“调试模式”。所有的代码都只是代码。各种优化选项的存在(-O2和-Os是您通常需要关注的唯一选项,除非您正在进行非常精细的调整)会修改生成的代码,但不会阻止与其他ABI兼容代码的互操作性。一般来说,您希望对要发布的内容进行优化 “-g”选项的存在将导致在生成的文件中放置扩展符号和源代码信息,这对调试很有用,但会增加文件的大小(并显示源代码),这是您在“已发布”二进制文件中通常不希望看到的
但它们不是排他性的。您可以使用优化和调试信息编译二进制文件,也可以不使用优化和调试信息编译二进制文件。这里是我经常使用的Makefile中的一部分(在本例中,它试图构建一个名为foo的程序) 如果像
$make BUILD=debug
或$make debug
然后将使用调试CFLAGS。这些关闭优化(-O0
)并包括调试符号(-g
)
如果省略这些标志(通过在没有任何附加参数的情况下运行$make
),您将构建发布CFLAGS版本,其中打开优化(-O2
),删除调试符号(-s
)并禁用断言(-DNDEBUG
)
正如其他人所建议的那样,您可以根据自己的具体需要尝试不同的-O*
设置
ifeq ($(BUILD),debug)
# "Debug" build - no optimization, and debugging symbols
CFLAGS += -O0 -g
else
# "Release" build - optimization, and no debug symbols
CFLAGS += -O2 -s -DNDEBUG
endif
all: foo
debug:
make "BUILD=debug"
foo: foo.o
# The rest of the makefile comes here...
我做了,但找不到直接的解释。我可能只是不擅长搜索。此外,SO的目的是出现在像谷歌这样的搜索引擎中,所以不管怎样,它最好在这里。这是公平的。这就是你想要的吗?或者您需要更多的上下文/信息吗?通常,您也需要
-DNDEBUG
来去除断言。并且您可能还需要-march=native-mtune=native
,只要您不打算将二进制文件分发到其他机器上。如果您打算调试生成的代码,通常应该禁用优化,否则你会发现调试就像大卫·林奇(David Lynch)的电影一样,并没有那么糟糕,我一直在看“发布”二进制文件的堆栈转储和valgrind输出。只要您不使用-fomit堆栈指针,并且理解静态可能是内联的和不可见的,您就可以从即使是高度优化的二进制文件中读取大量的上下文。如果你的函数很短,你通常可以通过一两个猜测找出崩溃的表达式。不过,与大卫·林奇(David Lynch)的电影不同,调试器让观众在不同的现实层次之间随意切换。如果您了解反汇编,那么单步执行(源代码行穿插)通常会有一定的意义,即使是优化。如果您不了解反汇编,那么您将了解。在相关说明中,有一些方法可以在“发布”版本中保留用于维护的调试符号。一种方法是:gcc-gsource.cc-oa.out;带a.out-o a.out.syms;剥去a.out
。使用objdump-t a.out
验证符号是否已实际剥离。MSVC也没有这些模式。这只是一些构建系统提出的一种约定,包括VisualStudioIDE目前使用的任何构建系统。