免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ck_lai
打印 上一主题 下一主题

[C]新手请教x+=y与x=x+y的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-02-21 17:11 |只看该作者
原帖由 flw2 于 2008-2-20 17:27 发表

呵呵,没事,我也没有不愉快,只是这种情况下实在很难理解,你说呢
没事了,不用回

最近老看你用 这个表情,有啥特别的吗?

论坛徽章:
0
22 [报告]
发表于 2008-02-21 17:43 |只看该作者
原帖由 zx_wing 于 2008-2-21 17:11 发表

最近老看你用 这个表情,有啥特别的吗?


没什么,跟“晕”差不多

论坛徽章:
0
23 [报告]
发表于 2008-02-22 10:51 |只看该作者
原帖由 blueboy83 于 2008-2-21 16:25 发表
这个编译器 难道不会优化吗,哈哈

不要将编译器想到万能...........

一些你认为理所当然的优化实际可能并不存在。

所以,我认为,可以的话,尽量写成第一种形式。

虽然只是一条指令的区别,但如果用在核心循环的话,效率就有可能明显了。

论坛徽章:
0
24 [报告]
发表于 2008-02-23 14:10 |只看该作者
原帖由 ck_lai 于 2008-2-20 12:07 发表
书中提到:x+=y比x=x+y少一次运算,不明白为什么,能解释一下吗?


从理论上讲, x=x+y 中对 x 进行两次求值,而在 x+=y 中只进行一次求值。实际上由于编译器的优化,一般这两种形式最终都产生同样的结果,在运行效率上也就没有差别;从而 += 存在的意义是书写简洁,特别是在 x 又是一个复杂表达式的情况下。当然,如果你的编译器不能对此进行优化,两者的效率就有可能有区别了。因此,在程序中应该总是使用前者形式为好。

论坛徽章:
0
25 [报告]
发表于 2008-02-24 15:47 |只看该作者
抠语法的话:
x = x+y:
mov eax, [x]
mov ebx, [y]
add eax,ebx
mov [x], eax

x += y:
mov eax, [y]
add [x],  eax

支持cat的观点,c语言不要太在意这种细节的东西。算法和架构才是最重要的
如果碰到核心循环,建议直接用汇编。
汇编语言倒是可以抠一下细节。最近正在测试乱序汇编对流水线性能的优化.......

论坛徽章:
0
26 [报告]
发表于 2008-02-24 16:55 |只看该作者
不一定真的会少。

是否x=x+y就比x+=y多一个指令,还得看编译器如何操作,


楼主可以看看“编译器优化”相关的知识。

x=x+y:

temp<-x+y,
x<-temp.

x+=y;

x<-x+y.

区别就在于是否使用了临时变量

论坛徽章:
0
27 [报告]
发表于 2008-02-24 17:02 |只看该作者

回复 #1 ck_lai 的帖子

x = x + y; 的处理过程是这样的: 从名字x对应的存储中取出值,从名字y对应的存储中取出值,两个值进行相加,产生一个临时单元,相加的结果首先存放在临时单元中,然后把临时单元的值赋值给x,即写到名字x对应的存储单元中去。

x += y, 直接取出x和y,相加然后把结果更新在x对应的存储单元中,所以少了从中间变量再给x赋值的过程。

论坛徽章:
0
28 [报告]
发表于 2008-02-24 21:18 |只看该作者
拿具体程序看把,有的能体现出少算了一次,因为X+=Y是第2N次的X,而X=X+Y是前面的X是第N+1次的,后面那个才是第N次的

论坛徽章:
0
29 [报告]
发表于 2008-02-25 10:53 |只看该作者
对于a = b + c;这一种,系统会先计算加法,并用一个临时的对象将那个和存储一下,然后再将那个临时对象里面的值赋给对象a.

而a += b;没有临时对象这个东西.

论坛徽章:
0
30 [报告]
发表于 2008-02-25 12:01 |只看该作者
原帖由 dxcnjupt 于 2008-2-24 15:47 发表
抠语法的话:
x = x+y:
mov eax, [x]
mov ebx, [y]
add eax,ebx
mov [x], eax

x += y:
mov eax, [y]
add [x],  eax

支持cat的观点,c语言不要太在意这种细节的东西。算法和架构才是最重要的
如果 ...



不敢苟同,
我想并不是直接操作内存单元,而是用CPU内部的累加器进行计算,然后再写回内存,
这两种写法,在C编译器层面产生的结果就应该是一样的,
指令运算更不会有差异,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP