| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 688 人关注过本帖
标题:【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
取消只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
 问题点数:0 回复次数:2 
【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
;*****************************************************************************************************************
;作者: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 编辑 ]
搜索更多相关主题的帖子: 版权 技巧 Email 
2012-08-30 14:06
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
自己沙发自己做

想拍板砖等我去工地给你搬
2012-08-30 14:10
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用silent_world在2012-8-30 14:55:15的发言:

所谓的技巧都是些特定使用场合的产物。
批判是应该的,但是,需要结合特定场合,辩证分析,给出其优缺点。
如此,才能达到批判性学习的效果。

有一点非常好,就是在分析过程中引入汇编。

大牛批评的极是
2012-08-30 16:15
快速回复:【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012966 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved