for循环里i++和++i的区别(for循环中i++与++i的效率探究 zy1691的专栏 博客频道 CSDN.NET)
for(int i=0;i<=50;i++)
我们经常会使用这样的代码来做循环 ,一般在for循环中习惯于使用i++ ,却很少使用++i 。虽然从代码执行的效果来看 ,它们并无任何区别 ,但是它们所生成的代码是有有所不同的 。
i++ :先引用后增加
++i :先增加后引用
意思就是说就是
i++ :先在i所在的表达式中使用i的当前值 ,后让i加1
++i :让i先加1 ,然后在i所在的表达式中使用i的新值
i++由于是在使用当前值之后再+1 ,所以会需要一个临时变量来转储 ,而++则直接+1 ,不存在这样的问题 。
这样考虑的话就会得出使用++i要优于i++的结论 ,是否真的如此?
还是让代码来说明一切吧 。试验使用如下代码:
int c=0;
for(int i=0;i<=50;i++)
c=c+i;
std::cout<<c;首先在debug下编译:
i++情况
; 9 : int c;
; 10 : for(int i=0;i<=50;i++)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
call__RTC_UninitUse
addesp, 4++i情况
; 9 : int c;
; 10 : for(int i=0;i<=50;++i)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
call__RTC_UninitUse
addesp, 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确实省去了对内存操作的环节 ,直接addeax, 1 ,用++i真的能提高性能 。
当然,上面是用debug版本 ,也就是说没有优化 ,那么在release优化的情况下会怎样呢 。
继续试验i++优化
; 9 : int c;
; 10 : for(int i=0;i<=50;i++)movecx, DWORD PTR _c$[esp+4]
xoreax, eax
$LL3@wmain:; 11 : c=c+i;
addecx, eax
inceax
cmpeax, 50; 00000032H
jleSHORT $LL3@wmain++i优化
; 9 : int c;
; 10 : for(int i=0;i<=50;++i)movecx, DWORD PTR _c$[esp+4]
xoreax, eax
$LL3@wmain:; 11 : c=c+i;
addecx, eax
inceax
cmpeax, 50; 00000032H
jleSHORT $LL3@wmain结论:在没有编译器优化的情况下,++i更好 。优化过后两者都一样 ,看起来似乎喜欢怎样写都无所谓了 。
但是如果这里的i不是int而是迭代器 ,那么++在前和在后就会有所不同 ,使用++i将会有切实的更高的效率 。虽然int情况下没多少区别 ,但为了语法上的统一 ,最好一律改用++i这种形式 。
所以 ,建议在这种地方一律改用++i的形式 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!