2

如果我正在做类似的事情

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

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

4

4 回答 4

2

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

于 2012-04-04T17:15:28.127 回答
1

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

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

虽然不建议您更改amid-run 的值。

于 2012-04-04T17:15:10.707 回答
1

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

有关更多信息,请参见循环不变代码运动

于 2012-04-04T17:20:54.760 回答
0

如果您不希望 len 每次都执行:

int length = len(arr);

for i = 0; i < length; i++ {
    ...
}
于 2012-04-04T17:13:26.120 回答