我知道-O1会自动打开某些标志。这些标志可以手动打开。如果我没有指定-O1,那么仍然可以通过指定-O1打开的所有标志来获得-O1优化。
我试过
-fthread-jumps -fcprop-registers -fguess-branch-probability
但它仍然没有做-O1优化。我可以告诉我何时使用gprof,因为性能不是很好。
我打开哪些标志来获取-O1优化?
答案 0 :(得分:13)
找到的一种方法:
gcc -O1 -c -Q -v dummy.c
(其中dummy.c是你的文件名。)这会导致gcc将命令用于命令行。
修改:请参阅此kastauyra's answer。您似乎无法仅使用-O1
标记来模拟完整的-f
优化。
答案 1 :(得分:11)
不幸的是,这是不可能的。 -O1启用了很多单独的优化标志,为true,但是GCC中的许多代码检查全局优化标志值并执行未由-f ..选项指定的优化。
答案 2 :(得分:3)
从手册:
-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
答案 3 :(得分:1)
您也可以尝试使用此编译指示(它需要GCC> = 4.4):
#pragma GCC optimize opt_list
void f()
此编译指示允许您打开和关闭给定功能的特定优化。 opt_list是没有-f。
的-f *选项列表还有更改优化级别的函数属性:
int f() __attribute__((optimize(1)));
您还可以更改全局优化级别(适用于所有后续功能):
#pragma GCC optimize 1
#pragma GCC optimize 0
您也可以使用(适用于所有后续功能):
#pragma GCC optimization_level n
和英特尔C编译器(doc;仅适用于下一个函数)
#pragma intel optimization_level n
答案 4 :(得分:0)
这取决于您的gcc
版本。请参阅gcc
manpage。
在我的计算机上,-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.