如何在不指定-O1的情况下获得gcc -O1优化

我知道-O1会自动打开某些标志。 但是,可以手动打开这些标志。 如果我没有指定-O1,那么仍然可以通过指定-O1打开的所有标志来获得-O1优化。

我试过了

-fthread-jumps -fcprop-registers -fguess-branch-probability 

但它仍然没有做-O1优化。 我可以告诉我何时使用gprof,因为性能不是很好。

我打开哪些标志来获得-O1优化?

一种方法可以找到:

 gcc -O1 -c -Q -v dummy.c 

(其中dummy.c是你的文件名。)这会导致gcc将用于命令行的标志喷出。

编辑:请参阅kastauyra的答案 。 看起来你不能单独使用-f标志来模拟完整的-O1优化。

不幸的是,这是不可能的。 -O1启用了许多单独的优化标志,为true,但是GCC中的许多代码检查全局优化标志值并执行未由-f ..选项指定的优化。

从手册:

 -O -O1 Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time. -O turns on the following optimization flags: -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -fipa-pure-const -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time 

您也可以尝试使用此pragma(它需要GCC> = 4.4):

 #pragma GCC optimize opt_list void f() 

此pragma允许您打开和关闭给定function的特定优化。 opt_list是没有-f的-f *选项列表。

还有一个function属性来改变优化级别:

 int f() __attribute__((optimize(1))); 

您还可以更改全局优化级别(适用于所有后续function):

 #pragma GCC optimize 1 #pragma GCC optimize 0 

您也可以使用(适用于所有后续function):

 #pragma GCC optimization_level n 

和英特尔C编译器( doc ;仅适用于下一个function)

 #pragma intel optimization_level n 

这取决于您的gcc版本。 请参阅gcc联机帮助页 。

在我的机器上, -O (即-O1 )打开以下优化:

  -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -finline-small-functions -fipa-pure-const -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-sra -ftree-ter -funit-at-a-time -O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging.