for循环用i++还是++i,for循环中i++与++i的循环是否一样

  for循环用i++还是++i,for循环中i++与++i的循环是否一样

  论zy1691博客频道-CSDN for循环专栏中I和I的效率。网

  关于for循环中I和I的效率

  2009-11-21 23:50

  279人阅读

  评论(0)

  收集

  报告for(int I=0;我我)

  我们经常用这段代码做循环。一般I习惯for循环,很少用I。虽然从代码执行的效果来看,两者没有区别,但是它们生成的代码是不同的。

  I:先引用再补充。

  I:引用前添加。

  也就是说。

  I:先在I所在的表达式中使用I的当前值,然后在I上加1。

  I:让I先加1,然后在I所在的表达式中使用I的新值。

  由于使用当前值后I为1,所以会需要一个临时变量来转储,但直接就是1,所以不存在这个问题。

  如果考虑到这一点,就会得出我比我强的结论,是真的吗?

  让代码解释一切。

  使用以下代码进行测试:

  int c=0;

  for(int I=0;我我)

  c=c I;

  STD:cout c;

  调试下的首次编译:

  一.情况

  ;9:int c;

  ;10:for(int I=0;我我)

  movDWORD PTR _i$20035[ebp],0

  jmpSHORT $LN3@wmain

  LN2 @ wmain:

  moveax,DWORD PTR _i$20035[ebp]

  addeax,1

  movDWORD PTR _i$20035[ebp],eax

  LN3 @ wmain:

  cmpDWORD PTR _i$20035[ebp],50;00000032H

  jgSHORT $LN1@wmain

  ;11:c=c I;

  cmpBYTE PTR $T25811[ebp],0

  jneSHORT $LN6@wmain

  pushOFFSET $LN7@wmain

  调用__RTC_UninitUse

  添加esp,4

  一.情况

  ;9:int c;

  ;10:for(int I=0;我我)

  movDWORD PTR _i$20035[ebp],0

  jmpSHORT $LN3@wmain

  LN2 @ wmain:

  moveax,DWORD PTR _i$20035[ebp]

  addeax,1

  movDWORD PTR _i$20035[ebp],eax

  LN3 @ wmain:

  cmpDWORD PTR _i$20035[ebp],50;00000032H

  jgSHORT $LN1@wmain

  ;11:c=c I;

  cmpBYTE PTR $T25811[ebp],0

  jneSHORT $LN6@wmain

  pushOFFSET $LN7@wmain

  调用__RTC_UninitUse

  添加esp,4

  LN6 @ wmain:

  moveax,DWORD PTR _c$[ebp]

  addeax,DWORD PTR _i$20035[ebp]

  movBYTE PTR $T25811[ebp],1

  movDWORD PTR _c$[ebp],eax

  jmpSHORT $LN2@wmain

  $LN1@wmain:

  可见I真的省去了内存操作,直接加eax,1,用I真的可以提升性能。

  当然上面用的是调试版,也就是没有优化。那么当发布被优化时会发生什么呢?

  继续实验。

  一.优化

  ;9:int c;

  ;10:for(int I=0;我我)

  movecx,DWORD PTR _c$[esp 4]

  xoreax,eax

  LL3 @ wmain:

  ;11:c=c I;

  addecx,eax

  inceax

  cmpeax,50;00000032H

  jle shortLL3 @ w main

  一.优化

  ;9:int c;

  ;10:for(int I=0;我我)

  movecx,DWORD PTR _c$[esp 4]

  xoreax,eax

  LL3 @ wmain:

  ;11:c=c I;

  addecx,eax

  inceax

  cmpeax,50;00000032H

  jle shortLL3 @ w main

  结论:不经过编译器优化,I更好。优化后,两者是一样的。好像你喜欢怎么写都没关系。

  但是如果这里的I不是int而是迭代器,那么前面和后面就不一样了,用I会更有效率。虽然在int的情况下没有太大的区别,但是为了语法统一,最好总是使用I的形式。

  所以建议像这样的地方都要用我。

for循环用i++还是++i,for循环中i++与++i的循环是否一样