【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
;*****************************************************************************************************************;作者:zklhp
;Email:zklhp@
;QQ:493165744
;2012.8.30
;版权所有 转载请保持完整
;*****************************************************************************************************************
感谢版主加高亮
论坛的某位大牛说要写直接的代码 我这里给个例子
经常有人问关于交换两个变量的技巧的问题 这里分析一下其中的一个【技巧】
对了 代码有点问题 两个数一样就出错了 本意是演示一下 有错误各位选择性无视罢
程序代码:
#include <stdio.h> int main(void) { int a = 0; int b = 0; int tmp = 0; printf("输一个数呗:"); scanf("%d", &a); printf("再输一个数呗:"); scanf("%d", &b); //所谓的不引入变量交换 a ^= b; b = a ^ b; a ^= b; printf("输出一下两数%d\t%d\n", a, b); //直接来 tmp = a; a = b; b = tmp; printf("再输出一下两数%d\t%d\n", a, b); return 0; }
代码如上 对于第一种交换技巧 gcc的O2优化 大概就相当于VC的Release 是这样编译的
程序代码:
mov eax,DWORD PTR [esp+0x1c] mov edx,DWORD PTR [esp+0x18] xor edx,eax xor eax,edx mov DWORD PTR [esp+0x1c],eax xor edx,eax mov DWORD PTR [esp+0x18],edx
看不懂没关系 你只要知道这里把变量从内存里面捣鼓出来 又捣鼓回去 还做了三次异或运算(XOR)就可以了
虽然异或操作是比较快的了 但为了交换变量费这么大的劲不值当的
直接来的呢
程序代码:
mov edx,DWORD PTR [esp+0x18] mov eax,DWORD PTR [esp+0x1c] mov DWORD PTR [esp+0x18],eax mov DWORD PTR [esp+0x1c],edx
诶 这里也没有那个中间变量啊
呵呵 这里编译器看懂了你的代码 知道这里的tmp其实只是为了交换两个变量 所以直接优化掉了这个变量 把代码编译成了交换两个量
结论 这个所谓的交换变量的【技巧】又难懂 又难写 还慢 直接的代码在开编译器优化的情况下可以获得很好的效率
http://graphics.stanford.edu/~seander/bithacks.html
里面讲了很多有关这些技巧的东西 但要批判性的学习 技巧用不好还不如不用
[ 本帖最后由 zklhp 于 2012-8-30 20:41 编辑 ]