再看算法时间和空间的转换

来源:互联网 发布:讨鬼传极pc优化补丁 编辑:程序博客网 时间:2024/05/17 04:00

关于如何不引入中间变量而直接使用交换两个变量的值,已知的使用(+/-、*//、^)等运算都可以做到,今天突然被一个资深的程序员问,为什么会有这样的东西出来?你知道使用加法或者乘法甚至异或的结果是什么。我马上想象这些代码的汇编代码会是什么样子的。回来以后,使用VC7试了一把,把结果放在这儿。相信自己什么时候都应该看得懂这几行代码:
???? 27: ???int temp;????????????????????????????????????????????????????????15: ???data[i]=data[i]^data[j];
??? 28: ???temp = data[i];???????????????????????????????????????????????00411B86? mov?? eax,dword ptr [i]
00411C82? mov??? eax,dword ptr [i]?????????????????????????? 00411B89? mov?? ecx,dword ptr [data]
00411C85? mov??? ecx,dword ptr [data]??????????????????? ?00411B8C? mov?? edx,dword ptr [j]
00411C88? mov??? edx,dword ptr [ecx+eax*4]??????????00411B8F? mov?? esi,dword ptr [data]
00411C8B? mov??? dword ptr [temp],edx????????????????? 00411B92? mov?? eax,dword ptr [ecx+eax*4]
??? 29: ???data[i]=data[j];?????????????????????????????????????????????00411B95? xor?? eax,dword ptr [esi+edx*4]
00411C8E? mov??? eax,dword ptr [i]??????????????????????????00411B98? mov?? ecx,dword ptr [i]
00411C91? mov??? ecx,dword ptr [data]???????????????????? 00411B9B? mov?? edx,dword ptr [data]
00411C94? mov??? edx,dword ptr [j]????????????????????????? 00411B9E? mov?? dword ptr [edx+ecx*4],eax
00411C97? mov??? esi,dword ptr [data]???????????????????? 16: ???data[j]=data[i]^data[j];
00411C9A? mov??? edx,dword ptr [esi+edx*4]????????? 00411BA1? mov?? eax,dword ptr [i]
00411C9D? mov??? dword ptr [ecx+eax*4],edx?????????00411BA4? mov?? ecx,dword ptr [data]
??? 30: ???data[j]=temp;????????????????????????????????????????????????00411BA7? mov?? edx,dword ptr [j]
00411CA0? mov??? eax,dword ptr [j]???????????????????????? 00411BAA? mov?? esi,dword ptr [data]
00411CA3? mov??? ecx,dword ptr [data]???????????????? ? 00411BAD? mov?? eax,dword ptr [ecx+eax*4]
00411CA6? mov??? edx,dword ptr [temp]????????????????? 00411BB0? xor?? eax,dword ptr [esi+edx*4]
00411CA9? mov??? dword ptr [ecx+eax*4],edx?????????00411BB3? mov?? ecx,dword ptr [j]
?????????????????????????????????????????????????????????????????????????????????00411BB6? mov?? edx,dword ptr [data]
?????????????????????????????????????????????????????????????????????????????????00411BB9? mov?? dword ptr [edx+ecx*4],eax
????????????????????????????????????????????????????????????????????????????????17: ???data[i]=data[i]^data[j];
???????????????????????????????????????????????????????????????????????????????00411BBC? mov?? eax,dword ptr [i]
???????????????????????????????????????????????????????????????????????????????00411BBF? mov?? ecx,dword ptr [data]
?????????????????????????????????????????????????????????????????????????????? 00411BC2? mov?? edx,dword ptr [j]
???????????????????????????????????????????????????????????????????????????????00411BC5? mov?? esi,dword ptr [data]
???????????????????????????????????????????????????????????????????????????????00411BC8? mov?? eax,dword ptr [ecx+eax*4]
?????????????????????????????????????????????????????????????????????????????? 00411BCB? xor?? eax,dword ptr [esi+edx*4]
???????????????????????????????????????????????????????????????????????????????00411BCE? mov?? ecx,dword ptr [i]
?????????????????????????????????????????????????????????????????????????????? 00411BD1? mov?? edx,dword ptr [data]
???????????????????????????????????????????????????????????????????????????????00411BD4? mov?? dword ptr [edx+ecx*4],eax
说说缺点:
这样采用多种算法以后的结果在计算能力上比引入中间变量带来更多的运算要求,在运行时间上代码长度明显增加。这样子的考虑在时间空间上都是一个损失,除了算法,没有什么意思。

原创粉丝点击