目錄
- 優化概述
- _O0優化
- _O1優化
- _O2優化
- _O3優化
- volatile關鍵字避免優化
優化概述
如果将未經優化的C語言程式直接運作會發現運作效率較低,并且産生的代碼較大,而通過優化可以較好地解決這些問題。
優化的作用是對循環進行化簡,重新組織表達式和聲明,将變量直接配置設定到寄存器中。
通過優化可以提高程式運作效率,縮小程式編碼數量。
C/C++編譯器提供了不同的優化選擇,通過修改cl55指令行中的-on選擇就可以友善地選擇不同的優化等級,n代表優化等級,包括0、1、2和3。下面給出不同優化等級的功能。
_O0優化
1、 簡化控制流圖
2、把變量配置設定到寄存器
3、分析循環的各種情況,隻保留一個退出循環的分支
4、删除未用的代碼
5、簡化表達式和聲明
6、把用inline聲明的函數變為調用關系
_O1優化
除了O0的各種優化功能外,還有如下功能:
1、在配置設定變量時,将數值直接賦給變量而不是給出變量的索引值
2、去掉沒有用的配置設定變量和表達式
3、去掉本地通用表達式
_O2優化
除了O1的各種優化功能外,還有如下功能:
1、完成循環優化
2、去掉全局通用的子表達式
3、去掉全局沒有用的配置設定變量和表達式
4、完成循環的化解
5、當隻用-O選項時優化器自動進行-O2優化
_O3優化
除了O2的各種優化功能外,還有如下功能:
1、去掉未調用的函數
2、簡化傳回值未使用的函數
3、将小函數進行内嵌調用
4、對被調用的函數聲明進行重新排序,以便被優化的調用方能夠找到該函數
5、完成檔案級優化
volatile關鍵字避免優化
優化器分析資料流時将盡量減少對記憶體的通路,如果這個資料必須從記憶體中得到,則該資料必須用volatile關鍵字定義,這樣可以使編譯器不對該變量進行優化。
例如聲明一個指針
當在循環中有如下語句時
優化器将隻在進入循環的初始化中進行一次記憶體讀,而在循環當中不在更新該變量的内容,如果該變量被中斷或其他程式改變,由于循環中的ctrl的值沒有更新,将會使程式不能按照正确的方式執行,這裡應當用如下方法聲明ctrl:
特别當該變量在中斷函數中被指派,而該變量在主函數的循環中被用到時,必須用volatile聲明該變量。