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選項(包含或不包含級別編號),則最後一個選項是有效的選項。
--------------------- 
作者:見青山 
來源:CSDN 
原文:https://blog.csdn.net/kobemin/article/details/83180747 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章