編譯器有很多種,但它們都包含的典型的32位類(lèi)型是:int,signed,signed int,unsigned,unsigned int,long,signed long,long int,signed long int,unsigned long,unsigned long int。盡量使用32位的數(shù)據(jù)類(lèi)型,因?yàn)樗鼈儽?6位的數(shù)據(jù)甚至8位的數(shù)據(jù)更有效率。
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] 上面的代碼比較慢。不僅因?yàn)橹噶顢?shù)目比較多,而且由于指令不能配對(duì)造成的FLID指令被延遲執(zhí)行。最好用以下代碼代替: 推薦的代碼:
編譯前 編譯后
double x; fild dword ptr [i] int i; fstp qword ptr [x] x = i; 在整數(shù)運(yùn)算中計(jì)算商和余數(shù)時(shí),使用無(wú)符號(hào)類(lèi)型比較快。以下這段典型的代碼是編譯器產(chǎn)生的32位整型數(shù)除以4的代碼:
不好的代碼 推薦的代碼
編譯前 編譯后
int i; mov eax, i i = i / 4; cdq and edx, 3 add eax, edx sar eax, 2 mov i, eax 編譯前 編譯后
unsigned int i; shr i, 2 i = i / 4; 總結(jié): 無(wú)符號(hào)類(lèi)型用于: 除法和余數(shù) 循環(huán)計(jì)數(shù) 數(shù)組下標(biāo) 有符號(hào)類(lèi)型用于: 整型到浮點(diǎn)的轉(zhuǎn)化 while VS. for
在編程中,我們經(jīng)常需要用到無(wú)限循環(huán),常用的兩種方法是while (1) 和 for (;;)。這兩種方法效果完全一樣,但那一種更好呢?然我們看看它們編譯后的代碼:
編譯前 編譯后
while (1); mov eax,1 test eax,eax je foo+23h jmp foo+18h 編譯前 編譯后
for (;;); jmp foo+23h 一目了然,for (;;)指令少,不占用寄存器,而且沒(méi)有判定跳轉(zhuǎn),比while (1)好。 使用數(shù)組型代替指針型
float x[VECLEN], y[VECLEN], z[VECLEN]; ...... for (unsigned int k = 1; k <; VECLEN; k ++) { x[k] = x[k-1] + y[k]; } for (k = 1; k <; VECLEN; k++) { x[k] = z[k] * (y[k] - x[k-1]); } float x[VECLEN], y[VECLEN], z[VECLEN]; ...... float t(x[0]); for (unsigned int k = 1; k <; VECLEN; k ++) { t = t + y[k]; x[k] = t; } t = x[0]; for (k = 1; k <; VECLEN; k ++) { t = z[k] * (y[k] - t); x[k] = t; } Switch 的用法
int days_in_month, short_months, normal_months, long_months; ......
switch (days_in_month) { case 28: case 29: short_months ++; break; case 30: normal_months ++; break; case 31: long_months ++; break; default: cout <;<; ";month has fewer than 28 or more than 31 days"; <;<; endl; break; } int days_in_month, short_months, normal_months, long_months; ......
switch (days_in_month) { case 31: long_months ++; break; case 30: normal_months ++; break; case 28: case 29: short_months ++; break; default: cout <;<; ";month has fewer than 28 or more than 31 days"; <;<; endl; break; } 所有函數(shù)都應(yīng)該有原型定義
動(dòng)態(tài)內(nèi)存分配(C++中的";new";)可能總是為長(zhǎng)的基本類(lèi)型(四字對(duì)齊)返回一個(gè)已經(jīng)對(duì)齊的指針。但是假如不能保證對(duì)齊,使用以下代碼來(lái)實(shí)現(xiàn)四字對(duì)齊。這段代碼假設(shè)指針可以映射到 long 型。