在使用gcc作為編譯器。在設定編譯條件時,在debug模式下生成的程式正常,但是在release模式下往往會出現很多種預料之外的結果,尤其在嵌入式環境中,程式在闆子上運作的時候,問題就愈發明顯。
為了了解具體為什麼造成該問題,對兩種模式下的配置做了對比
debug模式編譯器參數為<code>-o0 -g –wall</code>
release模式編譯器參數為<code>-o2 -g –wall</code>
通過對比可以發現兩種模式主要的不同在于編譯器優化程度不同,那麼編譯器在兩種優化下究竟做了什麼優化那?現在我們來看看gcc編譯器的優化參數到底做了什麼優化
這裡隻介紹優化編譯的參數
-o用來開啟優化編譯選項。
-o0:預設模式,不做任何優化。
-o1:優化。該模式下對于一個大的函數或功能會花費更多的時間和記憶體。
在-o1下:編譯會嘗試減少代碼體積和代碼運作時間。但是并不執行會花費大量時間的優化操作。
在該模式下将打開一下優化選項:
優化選項
描述
-fdefer-pop
推遲推出函數調用的參數,對于那些需要在函數調用後必須取出(pop)函數參數的機器而言,打開該項編譯器将把函數調用的參數壓入棧,等必要時幾個函數調用參數一起取出(pop)。這将節省處理時間。
-fdelayed-branch
如果對目标機支援這個功能,它試圖重新排列指令,以便利用延遲分支(delayed branch)指令後面的指令空隙.
-fguess-branch-probability
使用啟發式算法預測分之指令,增加指令的命中率,提升運作效果。
-fcprop-registers
使用寄存器之間copy-propagation傳值,因為在函數中把寄存器配置設定給變量, 是以編譯器執行第二次檢查以便減少排程依賴性(兩個段要求使用相同的寄存器)并且删除不必要的寄存器複制操作
-floop-optimize
通過優化如何生成彙編語言中的循環, 編譯器可以在很大程式上提高應用程式的性能。 通常, 程式由很多大型且複雜的循環構成。 通過删除在循環内沒有改變值的變量指派操作, 可以減少循環内執行指令的數量, 在很大程度上提高性能。 此外優化那些确定何時離開循環的條件分支, 以便減少分支的影響
-fif-conversion
if-then語句應該是應用程式中僅次于循環的最消耗時間的部分,簡單的if-then語句可能在最終的彙編語言代碼中産生衆多的條件分支通過減少或者删除條件分支, 以及使用條件傳送 設定标志和使用運算技巧來替換他們, 編譯器可以減少if-then語句中花費的時間量。
-fif-conversion2
這種技術結合更加進階的數學特性, 減少實作if-then語句所需的條件分支。
-ftree-ccp
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-ter
-ftree-lrs
-ftree-sra
-ftree-copyrename
-ftree-fre
-ftree-ch
-funit-at-a-time
-fmerge-constants
該模式下在不影響調試的狀況下還會打開‘-fomit-frame-pointer優化項。
同時該模式不會為ada編譯器打開‘-ftree-sra’優化項,如需要則請使用指令參數輸入‘-ftree-sra’進行優化。
進一步優化.gcc執行幾乎所有支援的操作但不包括空間和速度之間權衡的優化。
-o2優化等級下,并不執行循環展開和函數“内聯”優化操作。
與-o1比較該優化-o2将會花費更多的編譯時間當然也會生成性能更好的代碼。
-o2除了打開-o1的所有優化參數外還打開以下優化選項。
-fthread-jumps
-fcrossjumping
-foptimize-sibling-calls
-fcse-follow-jumps -fcse-skip-blocks
-fgcse -fgcse-lm
-fexpensive-optimizations
-fstrength-reduce
-frerun-cse-after-loop -frerun-loop-o
-fcaller-saves
-fpeephole2
-fschedule-insns -fschedule-insns2
-fsched-interblock -fsched-spec
-fregmove
-fstrict-aliasing
-fdelete-null-pointer-checks
-freorder-blocks -freorder-functions
-falign-functions -falign-jumps
-falign-loops -falign-labels
-ftree-vrp
-ftree-pre
還要注意-fgcse下關于請求-o2優化等級的用于計算goto的程式。
-o3:更進一步優化。-o3打開-o2指定的所有優化操作并且打開:
1
2
3
-os:針對程式空間大小優化(多用于嵌入式系統)。
-os使能-o2中除去會增加程式空間的所有優化參數。同時-os還會執行更加優化程式空間的選項。
-os會關閉以下優化選項:
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-and-partition
-fprefetch-loop-arrays
-ftree-vect-loop-version
關于gcc編譯的優化選項一共有-o0(預設),-o1,-o2,-o3及-os五個參數。
各個參數優選内容如上所示。
但是各個優化内容到底是指什麼那?繼續分析。
轉載:http://blog.csdn.net/gatieme/article/details/48898261