编译器如何处理循环检查

时间:2012-04-04 17:11:16

标签: compiler-construction

如果我正在做类似

的事情
for i = 0; i < len(arr); i++ {
    ...
}

每次迭代都计算len()吗?对于gcc,可以设置任何优化标志来更改它。

4 个答案:

答案 0 :(得分:2)

我相信语言定义(假设我们在这里使用C / C ++)要求每次都调用它。 正如其他答案中所建议的那样,您必须自己进行此优化。编译器通常无法知道调用len()函数是否会产生副作用,或者在每次调用时都会返回相同的值,因此通常无法将其拉出循环。既然知道len()的作用,就可以进行优化。

答案 1 :(得分:1)

是的,每次迭代都会调用len()。如果你使用一个简单的变量,它是一样的。

for( i=0 ; i< a; i++)

虽然不建议您更改a运行中期的值。

答案 2 :(得分:1)

如果在每次迭代期间没有改变。它被称为循环不变量。 循环不变量可以(可以是单词)在循环体上方悬挂。 但没有必要为了正确而这样做。 并且在函数调用的情况下,编译器将难以确定该值是否是循环不变量。如果它是内联函数,那么理论上可以确定循环不变性。但我不确定任何特定的编译器是否真的这样做。

有关详细信息,请参阅loop invariant code motion

答案 3 :(得分:0)

如果你不想每次都执行len:

int length = len(arr);

for i = 0; i < length; i++ {
    ...
}