談到優化,很多人都會直接想到彙編。難道優化只能在彙編層次嗎?當然不是,C++層次一樣可以作代碼優化,其中有些常常是意想不到的。在C++層次進行優化,比在彙編層次優化具有更好的移植性,應該是優化中的首選做法。
確定浮點型變數和運算式是 float 型
為了讓編譯器產生更好的代碼(比如說產生3DNow! 或SSE指令的代碼),必須確定浮點型變數和運算式是 float 型的。要特別注意的是,以 ";F"; 或 ";f"; 為尾碼(比如:3.14f)的浮點常量才是 float 型,否則預設是 double 型。為了避免 float 型參數自動轉化為 double,請在函數聲明時使用 float。
使用32位的資料類型
編譯器有很多種,但它們都包含的典型的32位類型是:int,signed,signed int,unsigned,unsigned int,long,signed long,long int,signed long int,unsigned long,unsigned long int。儘量使用32位的資料類型,因為它們比16位元的資料甚至8位元的資料更有效率。
明智使用有符號整型變數
在很多情況下,你需要考慮整型變數是有符號還是無符號類型的。比如,保存一個人的體重資料時不可能出現負數,所以不需要使用有符號類型。但是,如果是要保存溫度資料,就必須使用到有符號的變數。
在許多地方,考慮是否使用有符號的變數是必要的。在一些情況下,有符號的運算比較快;但在一些情況下卻相反。
比如:整型到浮點轉化時,使用大於16位元的有符號整型比較快。因為x86構架中提供了從有符號整型轉化到浮點型的指令,但沒有提供從無符號整型轉化到浮點的指令。看看編譯器產生的彙編代碼:
不好的代碼:
編譯前 編譯後
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]
上面的代碼比較慢。不僅因為指令數目比較多,而且由於指令不能配對造成的FLID指令被延遲執行。最好用以下代碼代替:
推薦的代碼:
編譯前 編譯後
double x; fild dword ptr [i]
int i; fstp qword ptr [x]
x = i;
在整數運算中計算商和餘數時,使用無符號類型比較快。以下這段典型的代碼是編譯器產生的32位整型數除以4的代碼:
不好的代碼 推薦的代碼
編譯前 編譯後
int i; mov eax, i
i = i / 4; cdq
and edx, 3
add eax, edx
sar eax, 2
mov i, eax


