C++ gcc优化级别1的子选项

C++ gcc优化级别1的子选项,c++,gcc,compilation,options,C++,Gcc,Compilation,Options,我的一个项目模块使用gcc的-O优化选项时出现了“虚拟内存耗尽:无法分配内存”错误。如果我从命令行中删除-O,错误就会消失 我检查了gcc规范,发现以下选项是通过-O -fauto-inc-dec -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probabi

我的一个项目模块使用gcc的
-O
优化选项时出现了“虚拟内存耗尽:无法分配内存”错误。如果我从命令行中删除
-O
,错误就会消失

我检查了gcc规范,发现以下选项是通过
-O

      -fauto-inc-dec 
      -fcompare-elim 
      -fcprop-registers 
      -fdce 
      -fdefer-pop 
      -fdelayed-branch 
      -fdse 
      -fguess-branch-probability 
      -fif-conversion2 
      -fif-conversion 
      -fipa-pure-const 
      -fipa-profile 
      -fipa-reference 
      -fmerge-constants
      -fsplit-wide-types 
      -ftree-bit-ccp 
      -ftree-builtin-call-dce 
      -ftree-ccp 
      -ftree-ch 
      -ftree-copyrename 
      -ftree-dce 
      -ftree-dominator-opts 
      -ftree-dse 
      -ftree-forwprop 
      -ftree-fre 
      -ftree-phiprop 
      -ftree-slsr 
      -ftree-sra 
      -ftree-pta 
      -ftree-ter 
      -funit-at-a-time
我的新命令行现在添加了以下选项

-fauto公司dec-fdce-fdefer pop-fdse-fguess分支概率-fif-conversion2-fif转换-fipa纯常量-fipa参考-fmerge常量-fsplit宽类型-ftree内置调用dce-ftree ccp-ftree ch-ftree复制重命名-ftree dce-ftree支配者选项-ftree dse-ftree forwprop-ftree fre-ftree phiprop-ftree sra-ftree pta-ftree ter-funit-at-a-time-g-管道-墙壁-Wp,-D_加固_源=2-FEExceptions-fstack保护器-fno var跟踪-fno var跟踪分配
但我无法重现该问题

我正在使用的gcc版本无法识别某些选项(我已从命令行中删除了它们)

gcc-v

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/i686-redhat-linux/4.5.1/lto-wrapper
Target: i686-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch=i686 --build=i686-redhat-linux
Thread model: posix
gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)
有人能告诉我可能出了什么问题吗

谢谢


注:我试图编译的代码中有大量STL内容。

您可能希望获得特定编译器使用的精确优化选项列表。它们可能因编译器而异,也可能因目标而异

使用
-Q
--help=optimizers
可以在这里帮助您。例如,假设您使用以下命令进行编译(它会创建断开的代码):

如果此命令创建工作代码:

gcc -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -O -I. -g -c myfile.cpp
通过在命令开头添加
-Q
,在命令末尾添加
--help=optimizers
,可以获得不同的选项。对于断开的命令:

gcc -Q -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -I. -g -c myfile.cpp --help=optimizers > broken-opts
工作组:

gcc -Q -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -O -I. -g -c myfile.cpp --help=optimizers > working-opts
查找在
已断开的选项文件中标记为“
[已启用]
”,但在
工作选项文件中标记为“
[已禁用]
”的选项:

diff broken-opts working-opts | grep '<'

diff-breaked-opts-working-opts | grep'您可能希望获得特定编译器使用的精确优化选项列表。它们可能因编译器而异,也可能因目标而异

使用
-Q
--help=optimizers
可以在这里帮助您。例如,假设您使用以下命令进行编译(它会创建断开的代码):

如果此命令创建工作代码:

gcc -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -O -I. -g -c myfile.cpp
通过在命令开头添加
-Q
,在命令末尾添加
--help=optimizers
,可以获得不同的选项。对于断开的命令:

gcc -Q -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -I. -g -c myfile.cpp --help=optimizers > broken-opts
工作组:

gcc -Q -march=armv7-a -mfloat-abi=softfp -mthumb -std=c++11 -FPIC -DNDEBUG -O -I. -g -c myfile.cpp --help=optimizers > working-opts
查找在
已断开的选项文件中标记为“
[已启用]
”,但在
工作选项文件中标记为“
[已禁用]
”的选项:

diff broken-opts working-opts | grep '<'

diff-breaked-opts-working-opts | grep'为什么不构建64位?另外,错误是来自GCC还是在运行时?错误是来自链接时的GCC。使用
-o3
-o2
构建时会发生什么?您是单独编译每个文件(
-c
标志)并在以后链接它们,还是使用单个命令将其链接到GCC(compile+link)?看起来你的机器内存不足,你正在构建一些大的东西。你为什么不构建64位呢?另外,错误是来自GCC还是在运行时?错误是来自链接时的GCC。使用
-o3
-o2
构建时会发生什么?您是单独编译每个文件(
-c
标志)并在以后链接它们,还是使用单个命令将其链接到GCC(compile+link)?看起来你的机器内存不足,你正在构建一些大的东西。