在我的设计与分析讲座中 教师说,for循环所用的算法将花费更少的时间,然后循环用于以下样本算法。
1. for(int i=0;i<5;i++)
{
2. print(i);
}
1. int i=0;
2. while(i<5)
{
3. print(i);
4. i++;
}
他说编译器会读取1. of for while 5次line 2. 4次因此总时间5 + 4 = 9 但在while循环的情况下。编译器将读取1. 1次,2。 5次,3次4次,4次4次。因此总时间1 + 5 + 4 + 4 = 14次 请告诉我这是对的。 for循环是否比while循环更快?
感谢。
答案 0 :(得分:6)
至少在MSVC 16(VS 2010)中,代码在两种情况下几乎相同:
作为强>
; Line 5
xor esi, esi
$LL3@main:
; Line 6
push esi
push OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
call _printf
inc esi
add esp, 8
cmp esi, 5
jl SHORT $LL3@main
<强>而强>
; Line 4
xor esi, esi
$LL2@main:
; Line 6
push esi
push OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
call _printf
; Line 7
inc esi
add esp, 8
cmp esi, 5
jl SHORT $LL2@main
答案 1 :(得分:2)
在所有现代编译器中loop analysis都是在较低级别的中间表示上完成的(即,当所有高级循环结构都扩展为标签和跳转时)。对于编译器,两个循环都是绝对等效的。
答案 2 :(得分:2)
我将传递性能(提示:没有区别,请检查生成的IR或程序集以进行校对)但语法和维护有两个重要区别。< / p>
<强>语法强>
i
变量的范围不同。在for
案例中,i
只能在for
标题和正文中访问,而在while
中它在循环后可用。作为一般规则,最好有更紧凑的范围,更少的变量在飞行中意味着更少的上下文在编码时担心。
<强>维护强>
for
循环具有将所有迭代操作分组在一起的简洁优势,因此可以一次性检查它们并进行检查。
此外,在引入continue
语句时有一个重要区别:
for(int i = 0; i != 10; ++i) {
if (array[i] == nullptr) { continue; }
// act on it
}
int i = 0;
while (i != 10) {
if (array[i] == nullptr) { continue; }
// act on it
++i;
}
在while
案例中,continue
的引入造成了一个错误:无限循环,因为计数器已不再实现。
<强>冲击强>
对于常规迭代模式, for
循环更具可读性和全面性。更好的是,在C ++ 11中,range-for语句:
for (Item const& item : collection) {
}
编译器完全负责迭代,所以你一定不要搞砸了! (它使得for_each
算法有些无动于衷......我们可以希望旧形式开始撤退)
通过证据:while
循环应该保留给不规则的迭代模式,这样它们会在代码审查期间引起特别的关注,并通过突出显示 不规则性来保护未来的维护者的情况。