编译器如何处理for循环检查

问题描述 投票:0回答:4

如果我做类似的事情

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

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

c gcc optimization
4个回答
2
投票

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


1
投票

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

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

虽然不建议您在运行中更改

a
的值。


1
投票

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

请参阅循环不变代码运动了解更多信息


0
投票

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

int length = len(arr);

for i = 0; i < length; i++ {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.