| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 688 人关注过本帖
标题:【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
 问题点数:0 回复次数:9 
【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
;*****************************************************************************************************************
;作者: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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
学习

梅尚程荀
马谭杨奚







                                                       
2012-08-30 14:14
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
所谓的技巧都是些特定使用场合的产物。
批判是应该的,但是,需要结合特定场合,辩证分析,给出其优缺点。
如此,才能达到批判性学习的效果。

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

[ 本帖最后由 silent_world 于 2012-8-30 14:57 编辑 ]
2012-08-30 14:55
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
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
呵呵,惭愧——
本人不是大牛;也谈不上批评,只是表示下看法。
请勿见怪。
2012-08-30 16:40
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
就是算是能够节约一个 int 的内存,并且能够提节约少量的运行时间,采取第一种方法也是以牺牲代码清楚性为代价的。
一般认为,即使可以使用更高效的算法,成倍的提高运行时间,如果不是关键代码(比如多重循环内),以牺牲代码的可读性和清晰性为代价都需要谨慎权衡。

那个连接估计不错,一会看看去。
2012-08-30 17:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这些技巧很多时候仅仅是程序员的习惯而已,我喜欢这么做,他喜欢那么做。效率的差别只是线性的。

与其纠结在这种无关紧要的代码级的差别上,不如把多花点功夫到算法级的优化上。

重剑无锋,大巧不工
2012-08-30 18:45
luyaker
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-8-30
收藏
得分:0 
帮LZ顶上去,大家看看
2012-08-30 19:24
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
顶一个,可以写更简单:
a ^= b ^= a ^= b;
收到的鲜花
  • pangding2012-08-31 10:23 送鲜花  5朵   附言:有创意
2012-08-30 22:21
快速回复:【内有汇编 不喜勿入】有些所谓的【技巧】还是不用的好
数据加载中...
 
   



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

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