【发布时间】:2015-07-23 01:43:23
【问题描述】:
这是一个我想了很久的简单问题: 当我做一个这样的循环时:
for (int i = 0; i < myVector.size() ; ++i) {
// my loop
}
由于每次都会检查条件i < myVector.size(),我是否应该在循环之前将数组的大小存储在变量中以防止每次迭代调用 size() ?还是编译器足够聪明,可以自己做?
mySize = myVector.size();
for (int i = 0; i < mySize ; ++i) {
// my loop
}
我会用一个更复杂的条件来扩展这个问题,例如i < myVector.front()/myVector.size()
编辑: 我不在循环内使用 myVector,只是在这里给出结束条件。那么更复杂的情况呢?
【问题讨论】:
-
感谢大家的回答!但是没有人回答更复杂的条件。编译器是否足够聪明,可以看到除法的结果不会因为我不修改循环内的向量而改变?
-
我不知道是否(或:哪个)编译器足够聪明,可以注意到
myVector.front()/myVector.size()是一个常量表达式(前提是您不修改循环内的向量)。无论如何,这是一个优化问题,编译器版本和优化模式之间的结果可能会有所不同。所以我不会告诉你是否应该在循环之前计算终止值;只需将您的代码编译为汇编源代码,然后查看编译器是否会在每次迭代中产生完整的计算。如果是这样,那么自己优化可能是有意义的。
标签: c++ performance for-loop