c++ for循环中定义的变量会影响效率吗?
例如:intsum=0,tmp;for(inti=0;i<10;++i){tmp=i*i+3*i+24;sum+=tmp;}printf("%d\n",sum):如果把t...
例如:
int sum = 0, tmp;
for (int i = 0; i < 10; ++i) {
tmp = i * i + 3*i + 24;
sum += tmp;
}
printf("%d\n", sum):
如果把tmp的定义改成在for循环中定义:
int sum = 0;
for (int i = 0; i < 10; ++i) {
int tmp = i * i + 3*i + 24;
sum += tmp;
}
printf("%d\n", sum):
如果循环次数很多的话,效率会有不同吗? 展开
int sum = 0, tmp;
for (int i = 0; i < 10; ++i) {
tmp = i * i + 3*i + 24;
sum += tmp;
}
printf("%d\n", sum):
如果把tmp的定义改成在for循环中定义:
int sum = 0;
for (int i = 0; i < 10; ++i) {
int tmp = i * i + 3*i + 24;
sum += tmp;
}
printf("%d\n", sum):
如果循环次数很多的话,效率会有不同吗? 展开
4个回答
展开全部
对于优化编译的程序而言,上述两个代码片段不会有任何效率上的差异。
不优化的话,第一个效率会好一些。
不优化的话,第一个效率会好一些。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
变量i=0,i<9,i++
for(i=0,i<9,i++)
当i执行到i=8时就不在循环了!
for(i=0,i<9,i++)
当i执行到i=8时就不在循环了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for中改写成简单的过程,两种反汇编如下
int sum = 0,tmp;
0134136E mov dword ptr [sum],0
for (int i = 0; i < 10; ++i) {
01341375 mov dword ptr [i],0
0134137C jmp main+37h (1341387h)
0134137E mov eax,dword ptr [i]
01341381 add eax,1
01341384 mov dword ptr [i],eax
01341387 cmp dword ptr [i],0Ah
0134138B jge main+4Fh (134139Fh)
tmp =24;
0134138D mov dword ptr [tmp],18h
sum += tmp;
01341394 mov eax,dword ptr [sum]
01341397 add eax,dword ptr [tmp]
0134139A mov dword ptr [sum],eax
}
///////////////////////////////////////////
int sum = 0;
00A5136E mov dword ptr [sum],0
for (int i = 0; i < 10; ++i) {
00A51375 mov dword ptr [i],0
00A5137C jmp main+37h (0A51387h)
00A5137E mov eax,dword ptr [i]
00A51381 add eax,1
00A51384 mov dword ptr [i],eax
00A51387 cmp dword ptr [i],0Ah
00A5138B jge main+4Fh (0A5139Fh)
int tmp =24;
00A5138D mov dword ptr [tmp],18h
sum += tmp;
00A51394 mov eax,dword ptr [sum]
00A51397 add eax,dword ptr [tmp]
00A5139A mov dword ptr [sum],eax
}
单看反汇编行数没差别,应该是编译器将c++解释成机器语言的过程进行了一定的优化,
for中换成其他非内置类型,比如带有析构的类,应该就能明显的比较出来了,毕竟需要对临时变量重复的销毁创建
int sum = 0,tmp;
0134136E mov dword ptr [sum],0
for (int i = 0; i < 10; ++i) {
01341375 mov dword ptr [i],0
0134137C jmp main+37h (1341387h)
0134137E mov eax,dword ptr [i]
01341381 add eax,1
01341384 mov dword ptr [i],eax
01341387 cmp dword ptr [i],0Ah
0134138B jge main+4Fh (134139Fh)
tmp =24;
0134138D mov dword ptr [tmp],18h
sum += tmp;
01341394 mov eax,dword ptr [sum]
01341397 add eax,dword ptr [tmp]
0134139A mov dword ptr [sum],eax
}
///////////////////////////////////////////
int sum = 0;
00A5136E mov dword ptr [sum],0
for (int i = 0; i < 10; ++i) {
00A51375 mov dword ptr [i],0
00A5137C jmp main+37h (0A51387h)
00A5137E mov eax,dword ptr [i]
00A51381 add eax,1
00A51384 mov dword ptr [i],eax
00A51387 cmp dword ptr [i],0Ah
00A5138B jge main+4Fh (0A5139Fh)
int tmp =24;
00A5138D mov dword ptr [tmp],18h
sum += tmp;
00A51394 mov eax,dword ptr [sum]
00A51397 add eax,dword ptr [tmp]
00A5139A mov dword ptr [sum],eax
}
单看反汇编行数没差别,应该是编译器将c++解释成机器语言的过程进行了一定的优化,
for中换成其他非内置类型,比如带有析构的类,应该就能明显的比较出来了,毕竟需要对临时变量重复的销毁创建
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询