Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注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/

10-11 23:04
查看更多