如何在不指定-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.