如果我做类似的事情
for i = 0; i < len(arr); i++ {
...
}
len() 是否在每次迭代时计算?对于 gcc 是否有任何优化标志可以设置来更改它。
我相信语言定义(假设我们在这里采用 C/C++)要求每次都调用它。 正如其他答案中所建议的,您必须自己进行此优化。编译器通常无法知道调用 len() 函数是否会产生副作用,或者每次调用时都会返回相同的值,因此通常无法将其从循环中拉出。既然您知道 len() 的作用,您就可以执行该优化。
是的,每次迭代都会调用 len()。如果你使用一个简单的变量来代替,效果是一样的。
for( i=0 ; i< a; i++)
虽然不建议您在运行中更改
a
的值。
如果它在每次迭代期间都没有改变。它被称为循环不变量。 循环不变量可以(“can”这个词)被提升到循环体之上。 但为了正确性没有必要这样做。 在函数调用的情况下,编译器将很难确定该值是否是循环不变的。如果它是内联函数,那么理论上可以确定循环不变性。但我不确定是否有任何特定的编译器确实这样做了。
请参阅循环不变代码运动了解更多信息
如果你不想每次都执行len:
int length = len(arr);
for i = 0; i < length; i++ {
...
}