高效的C編程

高效的C編程

1)C數據類型的有效用法

l         對於存放在寄存器中的局部變量,除了8位或16位的算數模運算符外,儘量不要使用char和short類型。而要使用有符號或者無符號的int類型。除法運算時使用無符號數執行速度更快。

l         對於存放在主存儲器中的數組和全局變量,在滿足數據大小的前提下,應儘可能使用小尺寸的數據類型,這樣做可以節省存儲空間。ARMv4體系結構可以有效的裝載和存儲所有寬度的數據,並可以使用遞增數組的指針來有效的訪問數組。對於short類型數組,要避免使用數組基地址的偏移,因爲LDRH指令不支持偏移尋址。

l         由於隱式或者顯式的數據類型轉換通常會有額外的指令週期開銷,所以在表達式中應儘量避免使用。load和store指令一般不會產生額外的轉換開銷,因爲load和store指令是自動完成數據類型轉換的。

l         對於函數參數和返回值應儘量避免使用char和short類型。即使參數範圍比較小,也應該使用int類型,以防止編譯器做不必要的類型轉換。

2)高效的編寫循環體

l         使用減計數到零的循環結構,這樣編譯器就不需要分配一個寄存器來保存循環中止值,而且與0比較的指令也可以省略。

l         使用無符號的循環計數值,循環繼續的條件爲i!=0而不是i>0,這樣可以保證循環開銷只有兩條指令。、

l         如果事先知道循環體至少會執行一次,那麼使用do-while循環要比for循環好,這樣可以使編譯器省去檢查循環計數值是否爲0的步驟。

l         展開重要的循環體可降低循環開銷,但不要過度展開,如果循壞的開銷對整個程序來說佔的比例很小,那麼循環展開反而會增加代碼量並降低cache性能。

l         儘量使數組的大小是4或8的倍數,這樣就可以容易地以2,4,8次等多種選擇展開循環,而不需要擔心剩餘數組元素的問題。

3)高效的寄存器分配

l         應該儘量限制函數內部循環所用局部變量的數目,最多不超過12個,這樣,編譯器就可以把這些變量都分配給ARM寄存器。

l         可以引導編譯器,通過查看是否屬於最內層循環變量來確定某個變量的重要性

4)高效的調用函數

l         儘量限制函數參數不要超過4個,這樣函數調用的效率會更高。也可以將幾個相關的參數組織在一個結構體中,用傳遞結構體指針來代替多個參數。

l         把比較小的被調用函數和調用函數放在同一個原文件中,並且要先定義,後調用,編譯器就可以優化函數調用或者內聯較小的函數。

l         對性能影響較大的重要函數可使用關鍵字_inline進行內聯。

5)避免指針別名

l         不要依賴編譯器來消除包含存儲訪問的公共子表達式,而應建立一個新的局部變量來保存這個表達式的值,這樣可以保證只對這個表達式求職一次。

l         避免使用局部變量的地址,否則對這個變量的訪問效率會比較低。

6)高效的結構體安排

l         結構體元素要按照元素的大小來排列,以最小的元素放在開始,最大的元素安排在最後。

l         避免使用很大的結構體,可以使用層次化的小結構體來代替。

l         爲了提高可移植性,人工對API的結構體添加填充位,這樣,結構體的安排將不會依賴於編譯器。

 

 

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