Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
6年前关闭。
Improve this question
我经常注意到以下模式:
上面循环的复杂度为
但是,如果我们在循环之前计算
我确信还有许多其他这样的优化。
编译器是否进行了此类优化,还是程序员必须采取预防措施来防止这种优化?
想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
6年前关闭。
Improve this question
我经常注意到以下模式:
for (int i = 0; i < strlen(str); ++i) {
// do some operations on string
}
上面循环的复杂度为
O(N²)
,因为strlen
的复杂度为N
,并且在每次迭代期间进行比较。但是,如果我们在循环之前计算
strlen
并使用该常数,则循环的复杂性将降低为O(N)
。我确信还有许多其他这样的优化。
编译器是否进行了此类优化,还是程序员必须采取预防措施来防止这种优化?
最佳答案
尽管我没有任何确凿的证据,但我的猜测是:
编译器对变量str
进行数据流分析。如果可能在循环内对其进行修改或将其标记为volatile
,则不能保证strlen(str)
在每次迭代之间保持不变,因此无法缓存。否则,应安全缓存并进行优化。
关于c++ - 循环的编译器优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23988956/