有關C++優(yōu)化代碼問題詳細說明
C++也支持面向過程的程序設計,不是一個純正的面向對象的語言,它保持了C的簡潔、高效和接近匯編語言等特點,引入了類的機制,最初的C++被稱為“帶類的C”,好了,那么就現(xiàn)在開始進行C++優(yōu)化代碼的講解吧。
為了讓編譯器產生更好的C++優(yōu)化代碼(比如說產生3DNow! 或SSE指令的代碼),必須確定浮點型變量和表達式是 float 型的。要特別注意的是,以 ";F"; 或 ";f"; 為后綴(比如:3.14f)的浮點常量才是 float 型,否則默認是 double 型。為了避免 float 型參數(shù)自動轉化為 double,請在函數(shù)聲明時使用 float。
使用32位的數(shù)據(jù)類型
編譯器有很多種,但它們都包含的典型的32位類型是:int,signed,signed int,unsigned,unsigned int,long,signed long,long int,signed long int,unsigned long,unsigned long int。盡量使用32位的數(shù)據(jù)類型,因為它們比16位的數(shù)據(jù)甚至8位的數(shù)據(jù)更有效率。 #t#
明智使用有符號整型變量
在很多情況下,你需要考慮整型變量是有符號還是無符號類型的。比如,保存一個人的體重數(shù)據(jù)時不可能出現(xiàn)負數(shù),所以不需要使用有符號類型。但是,如果是要保存溫度數(shù)據(jù),就必須使用到有符號的變量。
在許多地方,考慮是否使用有符號的變量是必要的。在一些情況下,有符號的運算比較快;但在一些情況下卻相反。比如:整型到浮點轉化時,使用大于16位的有符號整型比較快。因為x86構架中提供了從有符號整型轉化到浮點型的指令,但沒有提供從無符號整型轉化到浮點的指令??纯淳幾g器產生的匯編代碼,不好的代碼:
- double x; mov [foo + 4], 0
- unsigned int i; mov eax, i
- x = i; mov [foo], eax
- flid qword ptr [foo]
- fstp qword ptr [x]
上面的代碼比較慢。不僅因為指令數(shù)目比較多,而且由于指令不能配對造成的FLID指令被延遲執(zhí)行。最好用以下C++優(yōu)化代碼代替,推薦的C++優(yōu)化代碼:
- double x; mov [foo + 4], 0
- unsigned int i; mov eax, i
- x = i; mov [foo], eax
- flid qword ptr [foo]
- fstp qword ptr [x]
在整數(shù)運算中計算商和余數(shù)時,使用無符號類型比較快。以下這段典型的代碼是編譯器產生的32位整型數(shù)除以4的代碼,不好的代碼 推薦的代碼:
- int i; mov eax, i
- ii = i / 4; cdq
- and edx, 3
- add eax, edx
- sar eax, 2
- mov i, eax
在編程中,我們常常需要用到無限循環(huán),常用的兩種方法是while (1) 和 for (;;)。這兩種方法效果完全一樣,但那一種更好呢?然我們看看它們編譯后的C++優(yōu)化代碼:
- int i; mov eax, i
- ii = i / 4; cdq
- and edx, 3
- add eax, edx
- sar eax, 2
- mov i, eax