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的形式。
所以建议像这样的地方都要用我。