关于-O0、O1、O2、O3优化
少优化->多优化:
O0 -->> O1 -->> O2 -->> O3
-O0表⽰没有优化,-O1为缺省值,-O3优化级别最⾼
整理⾃⽹络,仅供参考
1.-O,-O1:
这两个命令的效果是⼀样的,⽬的都是在不影响编译速度的前提下,尽量采⽤⼀些优化算法降低代码⼤⼩和可执⾏代码的运⾏速度。并开启如下的优化选项:
-fauto-inc-dec
-fbranch-count-reg
-fcombine-stack-adjustments
-fcompare-elim
-fcprop-registers
neea edu cn
-fdce
-fdefer-pop
-fdelayed-branch
-fd
-fforward-propagate
-fguess-branch-probability
-fif-conversion2
-fif-conversion
-finline-functions-called-once
-fipa-pure-const
-
fipa-profile
-fipa-reference
-fmerge-constants
-fmove-loop-invariants
-freorder-blocks
-fshrink-wrap
-fshrink-wrap-parate
-fsplit-wide-types
-fssa-backprop
-fssa-phiopt
-fstore-mergingscientist是什么意思
-
ftree-bit-ccp
-ftree-ccp
-ftree-ch
-ftree-coalesce-vars
-ftree-copy-prop
-ftree-dce
-ftree-dominator-optsviaggio
-ftree-d
-ftree-forwprop
-ftree-fre
-ftree-phiprop
-
ftree-sink
-ftree-slsr
-ftree-sra
-ftree-pta
-ftree-ter
-funit-at-a-time
2. -O2
//标配
该优化选项会牺牲部分编译速度,除了执⾏-O1所执⾏的所有优化之外,还会采⽤⼏乎所有的⽬标配置⽀持的优化算法,⽤以提⾼⽬标代码的运⾏速度。
-fthread-jumps
-falign-functions -falign-jumps
-falign-loops -falign-labels
-fcaller-saves
-fcrossjumping
-fc-follow-jumps -fc-skip-blocks
-fdelete-null-pointer-checks
-fdevirtualize -fdevirtualize-speculatively
-fexpensive-optimizations
-fgc -fgc-lm
-fhoist-adjacent-loads
-finline-small-functions
-findirect-inlining
-
adversity
fipa-cp
-fipa-cp-alignment
-fipa-bit-cp
-fipa-sra
-fipa-icf
-fisolate-erroneous-paths-dereference
-flra-remat
-foptimize-sibling-calls
-foptimize-strlen
-fpartial-inlining
-fpeephole2
-
freorder-blocks-algorithm=stc
-freorder-blocks-and-partition -freorder-functions
-frerun-c-after-loop
-fsched-interblock -fsched-spec
-fschedule-insns -fschedule-insns2
-fstrict-aliasing -fstrict-overflow新娘靠边闪
-ftree-builtin-call-dce
-ftree-switch-conversion -ftree-tail-merge
-fcode-hoisting
-ftree-pre
-ftree-vrp
-
fipa-ra
3. -O3
惊喜的英文该选项除了执⾏-O2所有的优化选项之外,⼀般都是采取很多向量化算法,提⾼代码的并⾏执⾏程度,利⽤现代CPU中的流⽔线,Cache等。
这是最⾼最危险的优化等级。⽤这个选项会延长编译代码的时间,并且在使⽤gcc4.x的系统⾥不应全局启⽤。⾃从3.x版本以来gcc的⾏为已经有了极⼤地改变。在3.x,-O3⽣成的代码也只是⽐-O2快⼀点点⽽已,⽽gcc4.x中还未必更快。⽤-O3来编译所有的软件包将产⽣更⼤体积更耗内存的⼆进制⽂件,⼤⼤增加编译失败的机会或不可预知的程序⾏为(包括错误)。这样做将得不偿失,记住过犹不及。在中使⽤-O3是不推荐的。
-finline-functions // 采⽤⼀些启发式算法对函数进⾏内联
-funswitch-loops // 执⾏循环unswitch变换
-fpredictive-commoning //
-fgc-after-reload //执⾏全局的共同⼦表达式消除
-ftree-loop-vectorize //
-ftree-loop-distribute-patterns
-fsplit-paths
北京西班牙语培训
-ftree-slp-vectorize
-fvect-cost-model
-ftree-partial-pre
-fpeel-loops
-fipa-cp-clone options
这个选项会提⾼执⾏代码的⼤⼩,当然会降低⽬标代码的执⾏时间。
4. -Os
这个优化标识和-O3有异曲同⼯之妙,当然两者的⽬标不⼀样,-O3的⽬标是宁愿增加⽬标代码的⼤⼩,
也要拼命的提⾼运⾏速度,但是这个选项是在-O2的基础之上,尽量的降低⽬标代码的⼤⼩,这对于存储容量很⼩的设备来说⾮常重要。
这个等级⽤来优化代码尺⼨。其中启⽤了-O2中不会增加磁盘空间占⽤的代码⽣成选项。这对于磁盘空间极其紧张或者CPU缓存较⼩的机器⾮常有⽤。但也可能产⽣些许问题,因此软件树中的⼤部分ebuild都过滤掉这个等级的优化。使⽤-Os是不推荐的。
为了降低⽬标代码⼤⼩,会禁⽤下列优化选项,⼀般就是压缩内存中的对齐空⽩(alignment padding)
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-algorithm=stc
-
roka
freorder-blocks-and-partition
-fprefetch-loop-arrays
5. -Ofast:
该选项将不会严格遵循语⾔标准,除了启⽤所有的-O3优化选项之外,也会针对某些语⾔启⽤部分优化。如:-ffast-math ,对于Fortran语⾔,还会启⽤下列选项:
魔术的英文-fno-protect-parens
当你老了 叶芝-fstack-arrays
6.-Og:
该标识会精⼼挑选部分与-g选项不冲突的优化选项,当然就能提供合理的优化⽔平,同时产⽣较好的可调试信息和对语⾔标准的遵循程度。