| 忽然发现,其实在变量名字前面加个volatile就可以防止被优化掉- - | 搞得这么麻烦- - |
嗯嗯 - -刚刚测试了在MDK下面的情况,现在测试VS2010里面的情况
测试代码如下:
volatile unsigned int t;
t = rand();
t %= 64;
测试的时候采用release编译模式(/O2)
先来试试无符号数的取模
t %= 64;
00DC100D and dword ptr [t],3Fh
很漂亮地优化成了一句位运算
试试除法
t /= 64;
001A100D shr dword ptr [t],6
同样的
乘法也看卡
t *= 64;
0105100D mov eax,dword ptr [t]
01051010 shl eax,6
01051013 mov dword ptr [t],eax
| 不知道为什么先把数据弄到寄存器里面位运算了又放回去- - |
乘以48
0127100D mov eax,dword ptr [t]
01271010 lea eax,[eax+eax*2]
01271013 shl eax,4
01271016 mov dword ptr [t],eax
乘以170
t *= 170;
00DC100D mov eax,dword ptr [t]
00DC1010 imul eax,eax,0AAh
00DC1016 mov dword ptr [t],eax
从测试结果来看,跟mdk基本没区别
再试试有符号数的情况
t %= 64;
0098100D mov eax,dword ptr [t]
00981010 and eax,8000003Fh
00981015 jns wmain+1Ch (98101Ch)
00981017 dec eax
00981018 or eax,0FFFFFFC0h
0098101B inc eax
0098101C mov dword ptr [t],eax
t /= 64;
0001100D mov eax,dword ptr [t]
00011010 cdq
00011011 and edx,3Fh
00011014 add eax,edx
00011016 sar eax,6
00011019 mov dword ptr [t],eax
t *= 64;
000B100D mov eax,dword ptr [t]
000B1010 shl eax,6
000B1013 mov dword ptr [t],eax
t *= 48;
00FF100D mov eax,dword ptr [t]
00FF1010 lea eax,[eax+eax*2]
00FF1013 shl eax,4
00FF1016 mov dword ptr [t],eax
t *= 170;
011A100D mov eax,dword ptr [t]
011A1010 imul eax,eax,0AAh
011A1016 mov dword ptr [t],eax
测试结果基本上跟mdk没什么区别,
结论也是一样的:只需要无符号数的时候就别用有符号数,给编译器留下优化的空间。