1. 程式人生 > >GCC -O 優化等級詳解

GCC -O 優化等級詳解

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選項(包含或不包含級別編號),則最後一個選項是有效的選項。