循环边界检查的效率最高

时间:2014-09-22 23:47:43

标签: c++

以下两个for循环实现中应该运行得更快还是相同?

这一个:

for(int i=0; i<objectPtr->bound; i++){

//do something that has no affect on objectPtr->bound

}

或者这个:

int myBound = objectPtr->bound;

for(int i=0; i<myBound; i++){
//do something that has no effect on objectPtr->bound or myBound
}

我的预感是后者更快但是可能有一部分编译过程我不明白这使得它们的速度相等。我认为前者必须在每个循环周期中进行地址解析,以确定值是否已更改。

是否有一些c ++语法可用于让编译器知道值/ bound不会改变。我知道volatile让编译器知道值总是有可能改变,所以我可以使用const int作为objectPtr-&gt;绑定变量来让编译器不总是在每次循环迭代时检查它的值吗?

1 个答案:

答案 0 :(得分:0)

编译器可能会发现objectPtr->bound的值在迭代之间不会发生变化。在这种情况下,它会自动将其提取到变量中以避免重复查找。

没有办法明确告诉编译器表达式的值不会改变。如果编译器本身无法检测到它,您可以将值复制到变量中。

不需要将局部变量声明为const。编译器可以看到您没有在循环中分配变量并推断其值不会改变。