注意:用GDB調(diào)試的時候需要關(guān)閉優(yōu)化選項
當(dāng)優(yōu)化標(biāo)識被啟用之后,,gcc編譯器將會試圖在不改變程序語義的情況下改變程序的結(jié)構(gòu), 以滿足代碼大小最小或運(yùn)行速度更快等目標(biāo)
內(nèi)容摘自:Options That Control Optimization
1. -O,,-O1
這兩個命令的效果是一樣的,,目的都是在不影響編譯速度的前提下,盡量采用一些優(yōu)化算法降低代碼大小和可執(zhí)行代碼的運(yùn)行速度,。并開啟如下的優(yōu)化選項:
-fauto-inc-dec
-fbranch-count-reg
-fcombine-stack-adjustments
-fcompare-elim
-fcprop-registers
-fdce
-fdefer-pop
-fdelayed-branch
-fdse
-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-separate
-fsplit-wide-types
-fssa-backprop
-fssa-phiopt
-fstore-merging
-ftree-bit-ccp
-ftree-ccp
-ftree-ch
-ftree-coalesce-vars
-ftree-copy-prop
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-forwprop
-ftree-fre
-ftree-phiprop
-ftree-sink
-ftree-slsr
-ftree-sra
-ftree-pta
-ftree-ter
-funit-at-a-time
2. -O2
該優(yōu)化選項會犧牲部分編譯速度,,除了執(zhí)行-O1所執(zhí)行的所有優(yōu)化之外,還會采用幾乎所有的目標(biāo)配置支持的優(yōu)化算法,,用以提高目標(biāo)代碼的運(yùn)行速度
-fthread-jumps
-falign-functions -falign-jumps
-falign-loops -falign-labels
-fcaller-saves
-fcrossjumping
-fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks
-fdevirtualize -fdevirtualize-speculatively
-fexpensive-optimizations
-fgcse -fgcse-lm
-fhoist-adjacent-loads
-finline-small-functions
-findirect-inlining
-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-cse-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
該選項除了執(zhí)行-O2所有的優(yōu)化選項之外,,一般都是采取很多向量化算法,提高代碼的并行執(zhí)行程度,,利用現(xiàn)代CPU中的流水線,,Cache等
-finline-functions // 采用一些啟發(fā)式算法對函數(shù)進(jìn)行內(nèi)聯(lián)
-funswitch-loops // 執(zhí)行循環(huán)unswitch變換
-fpredictive-commoning //
-fgcse-after-reload //執(zhí)行全局的共同子表達(dá)式消除
-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
這個優(yōu)化標(biāo)識和-O3有異曲同工之妙,當(dāng)然兩者的目標(biāo)不一樣,, -O3的目標(biāo)是寧愿增加目標(biāo)代碼的大小,,也要拼命的提高運(yùn)行速度, 但是這個選項是在-O2的基礎(chǔ)之上,,盡量的降低目標(biāo)代碼的大小,,這對于存儲容量很小的設(shè)備來說非常重要。 為了降低目標(biāo)代碼大小,,會禁用下列優(yōu)化選項,,一般就是壓縮內(nèi)存中的對齊空白(alignment padding)
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-algorithm=stc
-freorder-blocks-and-partition
-fprefetch-loop-arrays
5. -Ofast
該選項將不會嚴(yán)格遵循語言標(biāo)準(zhǔn),除了啟用所有的-O3優(yōu)化選項之外,,也會針對某些語言啟用部分優(yōu)化,。如:-ffast-math ,對于Fortran語言,,還會啟用下列選項
-fno-protect-parens
-fstack-arrays
6.-Og
優(yōu)化調(diào)試體驗(yàn),。 -Og應(yīng)該是標(biāo)準(zhǔn)edit-compile-debug周期的優(yōu)化級別選擇, 在保持快速編譯和良好調(diào)試體驗(yàn)的同時,,提供合理的優(yōu)化級別,。 用于生成可調(diào)試代碼,因?yàn)槟承┦占{(diào)試信息的編譯器通道在以下位置被禁用 -O0,。 像-O0 -Og完全禁用了許多優(yōu)化過程,,因此控制它們的單個選項無效。除此以外-Og 使所有 -O1 優(yōu)化標(biāo)志,,但那些可能會干擾調(diào)試的標(biāo)志除外:
-fbranch-count-reg
-fdelayed-branch
-fdse
-fif-conversion
-fif-conversion2
-finline-functions-called-once
-fmove-loop-invariants
-fssa-phiopt
-ftree-bit-ccp
-ftree-dse
-ftree-pta
-ftree-sra
|