谁能讲一下i++,i=i+1,i+=1是怎么执行的,效率如何

sis_ying 2008-10-23 12:44:20
谁能讲一下i++,i=i+1,i+=1是怎么执行的,效率如何 ,最好能详细说一下,小弟不明白啊
...全文
859 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
gpwoaibiancheng 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 razor87 的回复:]
就是,考虑算法是是正确的
[/Quote]

赞同!可是学习算法不容易啊
lookupheaven 2010-11-22
  • 打赏
  • 举报
回复
就是,考虑算法是是正确的
Bsi_l4 2010-08-16
  • 打赏
  • 举报
回复
但貌似学校的知识在编译器不会这种优化的年代,学校的老师会问学生这个问题,学校的教材还是比较旧的东西,该更新了,但总强调基础
dxx190j 2008-10-24
  • 打赏
  • 举报
回复
int main()
{
00412FF0 push ebp
00412FF1 mov ebp,esp
00412FF3 sub esp,0D8h
00412FF9 push ebx
00412FFA push esi
00412FFB push edi
00412FFC lea edi,[ebp-0D8h]
00413002 mov ecx,36h
00413007 mov eax,0CCCCCCCCh
0041300C rep stos dword ptr es:[edi]
0041300E mov byte ptr [ebp-0D1h],0
int i;
i++;
00413015 cmp byte ptr [ebp-0D1h],0
0041301C jne main+3Bh (41302Bh)
0041301E push offset (41309Dh)
00413023 call @ILT+180(__RTC_UninitUse) (4110B9h)
00413028 add esp,4
0041302B mov eax,dword ptr [i]
0041302E add eax,1
00413031 mov byte ptr [ebp-0D1h],1
00413038 mov dword ptr [i],eax
i = i + 1;
0041303B cmp byte ptr [ebp-0D1h],0
00413042 jne main+61h (413051h)
00413044 push offset (41309Dh)
00413049 call @ILT+180(__RTC_UninitUse) (4110B9h)
0041304E add esp,4
00413051 mov eax,dword ptr [i]
00413054 add eax,1
00413057 mov byte ptr [ebp-0D1h],1
0041305E mov dword ptr [i],eax
i +=1;
00413061 cmp byte ptr [ebp-0D1h],0
00413068 jne main+87h (413077h)
0041306A push offset (41309Dh)
0041306F call @ILT+180(__RTC_UninitUse) (4110B9h)
00413074 add esp,4
00413077 mov eax,dword ptr [i]
0041307A add eax,1
0041307D mov byte ptr [ebp-0D1h],1
00413084 mov dword ptr [i],eax
return 0;
00413087 xor eax,eax
}
zh1369 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lbh2001 的回复:]
现代的编译器已经足够聪明
对这种程度的优化已经非常好了
不必太关心这中无关痛痒的地方
提高效率最直接的是用高效的算法才是王道
[/Quote]
ok
Marginall 2008-10-24
  • 打赏
  • 举报
回复
UP
l51 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 curshxsg 的回复:]
0040102F  mov        eax,dword ptr [ebp-4] <====将[ebp-4]这个地址所指向的 dword内容装入到 eax 寄存器
00401032  add        eax,1 <====寄存器eax的值加上立即数 1
00401035  mov        dword ptr [ebp-4],eax <====将寄存器eax的内容回存到[ebp-4]这个地址所指向内存


能不能解释一下怎么看反汇编啊?

这个mov add eax,dword ptr 这些什么意思啊?
[/Quote]
l51 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhtigt 的回复:]
执行效率由高到低:
i++,
i+=1,
i=i+1,
[/Quote]
你是怎么得到这个结论的?我感到很新奇,能说一说么?

i++
i+=1
i=i+1
在没有前后句的情况下,编译情况可能是一样的,
但是有前后句的情况下,相差是很大的,
特别是在条件循环中的 i++, 它是取值后加,不是先加再取值,
相关的文章很多,自己搜一搜吧。
讨论 i++ 和 ++i 的。
i=i+1 与 i+=1 也是有差异的,i=i+1是赋值运算,而 i+=1 则是累加运算。在特定场合的编译是不同的。
lbh2001 2008-10-23
  • 打赏
  • 举报
回复
现代的编译器已经足够聪明
对这种程度的优化已经非常好了
不必太关心这中无关痛痒的地方
提高效率最直接的是用高效的算法才是王道
  • 打赏
  • 举报
回复
i++===>temp = i,i +=1;
i = i + 1;==>temp = i, i = temp + 1;
i += 1;=====> i += 1;
当然,这些都完全没考虑编译器优化情况

lbh2001 2008-10-23
  • 打赏
  • 举报
回复
你直接反汇编看汇编代码就是啦

i++;
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax
108:
109: ++i;
00401038 mov ecx,dword ptr [ebp-4]
0040103B add ecx,1
0040103E mov dword ptr [ebp-4],ecx
110:
111: i = i + 1;
00401041 mov edx,dword ptr [ebp-4]
00401044 add edx,1
00401047 mov dword ptr [ebp-4],edx
112:
113: i += 1;
0040104A mov eax,dword ptr [ebp-4]
0040104D add eax,1
00401050 mov dword ptr [ebp-4],eax
jackzhhuang 2008-10-23
  • 打赏
  • 举报
回复
i++,i若是整型,会被优化成++i,但i若是一个用户定义的类,就会调用重载操作符operator++(int),这个函数效率低于operator++()(即++i情况下调用),因为前者要返回一个原来对象的拷贝,再++,而后者直接++。

i=i+1,同样i若是整型,会被优化为++i,而i若是一个用户定义的类,那么i+1会先产生一个临时数据,在调用operator=给i赋值。

i+=1,i若是整型情况同上,i若是用户定义的类,将相当于调用operator+=,直接+1,注意这个时候没有临时变量产生,所以效率比i=i+1高。

ForestDB 2008-10-23
  • 打赏
  • 举报
回复
现代编译器应该都能够做到优化,真的感兴趣不妨从编译原理和优化的角度看这些问题。
zhtigt 2008-10-23
  • 打赏
  • 举报
回复
执行效率由高到低:
i++,
i+=1,
i=i+1,
dzc8866 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 curshxsg 的回复:]
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax


能不能解释一下怎么看反汇编啊?

这个mov add eax,dword ptr 这些什么意思啊?
[/Quote]

那你就看汇编语言啊;

同意各位的观点,算法才是王道
pan7861 2008-10-23
  • 打赏
  • 举报
回复
没太大区别可以不用考虑,要提高效率注意算法
curshxsg 2008-10-23
  • 打赏
  • 举报
回复
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax


能不能解释一下怎么看反汇编啊?

这个mov add eax,dword ptr 这些什么意思啊?
sc_valentine21 2008-10-23
  • 打赏
  • 举报
回复
个人觉得这些都是小方面。无关痛痒的东西,没得那个必要去研究
Dan_M 2008-10-23
  • 打赏
  • 举报
回复
实际效果感觉只是风格问题吧
Big鹏 2008-10-23
  • 打赏
  • 举报
回复

算法才是核心,算法才能体现出思想,建议好好学习算法,楼主!!
加载更多回复(2)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧