GCC提供選項控制代碼的優化等級:
這些選項可以實作不同程度的優化。
沒有任何優化選項的話,編譯時的目标是降低編譯成本,并使調試産生預期的結果。語句是獨立的:如果你使程式停止在語句之間設定的斷點處,你可以改變任何變量的值或者改變程式計數器的值使程式執行任意函數中的語句并得到源代碼中期望的結果。
打開優化标志使編譯器嘗試以編譯時間和可能的調試程式的能力為代價來改進性能和/或代碼大小。
編譯器根據程式的資訊執行優化。 一次編譯多個檔案生成單個可執行檔案的模式允許編譯器在編譯每個檔案時使用從所有檔案中擷取的資訊。
并非所有優化都由标志直接控制。以下僅列出具有标志的優化。
隻有在指令行上設定-O或其他等級的優化選項時,才會啟用大多數優化。 否則,即使指定了單獨的優化标志,它們也會被禁用。
根據目标和GCC的配置方式,可以在每個-O級别啟用略有不同的優化集。
-O、-O1:優化編譯需要更多時間,并且大型函數需要更多記憶體。使用-O選項,編譯器會嘗試減小代碼尺寸減少執行時間,不執行任何需要大量編譯時間的優化。
-O選項打開了如下優化标志:
-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
-fshrink-wrap -fsplit-wide-types -ftree-bit-ccp -ftree-ccp -fssa-phiopt -ftree-ch -ftree-copy-prop -ftree-copyrename -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
-O2:相對-O優化更多。 GCC幾乎執行所有支援的優化,但不涉及空速權衡。 與-O相比,此選項增加了編譯時間和生成代碼的性能。
-O2除了打開所有-O指定的優化标志,還打開了如下優化标志:
-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-sra -fipa-icf
-fisolate-erroneous-paths-dereference -flra-remat -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2
-freorder-blocks -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 -ftree-pre -ftree-vrp -fipa-ra
-O3:相對-O2優化更多。
-O3除了打開所有-O2指定的優化标志,還打開了如下優化标志:
-finline-functions, -funswitch-loops,
-fpredictive-commoning, -fgcse-after-reload, -ftree-loop-vectorize, -ftree-loop-distribute-patterns, -ftree-slp-vectorize,
-fvect-cost-model, -ftree-partial-pre and -fipa-cp-clone
-O0:減少編譯時間并使調試可以産生預期的結果,這也是預設的優化等級。
-Os:優化尺寸。 -Os啟用所有通常不會增加代碼大小的-O2優化。 它還執行旨在減少代碼大小的進一步優化。
-Os關閉如下優化标志:
-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks
-freorder-blocks-and-partition -fprefetch-loop-arrays
-Ofast:無視嚴格的标準合規性。 -Ofast啟用所有-O3優化。 它還打開并非對所有符合标準的程式有效的優化。 它打開
-ffast-math和Fortran特定的-fno-protect-parens和-fstack-arrays。
-Og:優化調試體驗。 -Og啟用不會幹擾調試的優化。 它是标準編輯 - 編譯 - 調試周期可以選擇的優化級别,提供合理的優化級别,同時保持快速編譯和良好的調試體驗。
如果使用多個-O選項(包含或不包含級别編号),則最後一個選項是有效的選項。