在vc release模式下調試時,經常可以看到下面形式的匯編代碼:
00FB1202 mov ecx,dword ptr ds:[00FB543Ch]
00FB1208 sub ecx,dword ptr ds:[00FB5438h]
00FB120E mov eax,66666667h
00FB1213 imul ecx
00FB1215 sar edx,5
00FB1218 mov ecx,edx
00FB121A shr ecx,1Fh
00FB121D add ecx,edx
其實這是當被除數是常量時除法的編譯器優化。x
/50h
優化方法是把除法轉換成乘以被除數然后右移.
x/y => x*(1 /y) => x* ((1<<37) /((1<<37)* y) ) =>x * ((1<<37)/ y)>>37
為了取整效果,最終結果將會是x/y = x * ((1<<37 +y-1 )/ y)>>37由于y 是常量,在編譯期,編譯器就可以計算出((1<<37 +y-1 )/ y)的值。
那么實際計算時,編譯期就可以把 x/y 轉換成 x *M >> 37, M = ((1<<37 +y-1 )/ y)
除以0x50 M = (1<<37 + 0x4F)/0x50 = 0x66666667
那么x / 0x50相當于 (x* 0x66666667)>>37