Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在发布模式下构建GCC中的优化?_C++_C_Gcc_G++ - Fatal编程技术网

C++ 如何在发布模式下构建GCC中的优化?

C++ 如何在发布模式下构建GCC中的优化?,c++,c,gcc,g++,C++,C,Gcc,G++,我需要在“发布模式”中构建哪些具体选项,并在GCC中进行全面优化?如果有多个选项,请列出所有选项。谢谢。 没有“一刀切”——您需要了解您的应用程序、需求和优化标志,以确定二进制文件的正确子集 或者你想要的答案: -O3-O2将启用所有不需要空间/速度权衡的优化,并且往往是我看到最常用的优化-O3在速度上做了一些权衡(比如函数内联)——Os做O2 plus做了其他事情来减少代码大小。通过提高缓存使用率,这可以使事情比O3更快。(测试以确定它是否适用于您。)注意,有大量选项没有一个O开关可以接触。它

我需要在“发布模式”中构建哪些具体选项,并在GCC中进行全面优化?如果有多个选项,请列出所有选项。谢谢。

没有“一刀切”——您需要了解您的应用程序、需求和优化标志,以确定二进制文件的正确子集

或者你想要的答案:
-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目前使用的任何构建系统。