**優化可以說是乙個非常複雜而又非常重要的問題,以筆者多年的linux c開發經驗來說優化通常分為兩個方面,一是人為優化,也就是基於程式設計經驗採用更簡易的資料結構函式等來降低編譯器負擔,二是採用系統自帶的優化模式,也就是gcc - o系列,下面我將簡述一下各級優化的過程以及實現。
gcc - o1 首先o1上面還有乙個o0,那個是不提供任何優化,專案中幾乎不會使用,而o1使用就非常廣泛了,o1是最基本的優化,主要對**的分支,表示式,常量來進行優化,編譯器會在較短的時間下將**變得更加短小,這樣體積就會變得更小,會減少記憶體的佔用率,在作業系統進行記憶體排程時就會更快。但是事情沒有絕對的優點,當乙個龐大的程式被拆碎細分的話,記憶體占用會大大增加,由於當今系統大多數都是多執行緒,就會出現卡頓和反應延遲。
gcc - o2 這個優化級別是o1的高階,在上一級的基礎上會進行更嚴格的細分,最重要的是加入了暫存器的使用。暫存器是cpu中重要的組成部分,此外還有運算器和控制器,計算機顧名思義,要進行各種龐雜的計算,由於cpu速度較快,所以計算的中間結果都會儲存在暫存器中,這樣可以大大提高系統的效率,但是暫存器造價高昂,數量有限,所以一般來說程式不會放在暫存器中,另一種將**放在暫存器的方式是使用register修飾變數,適用於頻繁呼叫的變數。
gcc - o3 這個優化屬於非常強大的優化,因為編譯器會進行**,對迴圈每一層的**,以便於將迴圈拆分,可以提高執行效率。編譯器還會試圖用已有的值來代替未知的值,並且還會用加代替乘,因為運算器的特性,乘法十分複雜耗時。當然o3的缺點最明顯,那就是o3因為試圖**程式的走向,可能會出現誤差,導致錯誤和程式不可逆轉的走向。所以一般o3不建議使用。
以上就是關於優化的三個等級,對於優化,系統的優化還是機械的,程式設計師對於語言深刻的理解,巧妙地演算法可能會更有意義。
linux 下gcc的使用
在linux系統中,可執行檔案沒有統一的字尾,系統從檔案的屬性來區分可執行檔案和不可執行檔案。而gcc則通過字尾來區別輸入檔案的類別,下面介紹gcc所遵循的部分約定規則。c為字尾的檔案,c語言源 檔案 a為字尾的檔案,是由目標檔案構成的庫檔案 c,cc或.cxx 為字尾的檔案,是c 源 檔案 h為字...
linux 下gcc的使用
在linux系統中,可執行檔案沒有統一的字尾,系統從檔案的屬性來區分可執行檔案和不可執行檔案。而gcc則通過字尾來區別輸入檔案的類別,下面介紹gcc所遵循的部分約定規則。c為字尾的檔案,c語言源 檔案 a為字尾的檔案,是由目標檔案構成的庫檔案 c,cc或.cxx 為字尾的檔案,是c 源 檔案 h為字...
linux下gcc的使用
假設源程式檔名為test.c。1.無選項編譯鏈結用法 gcc test.c2.選項 o用法 gcc test.c o test3.選項 e用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s用法 gcc s test.i 作用 將預處理輸出檔...