C++ 循环边界检查最有效的方法是什么

C++ 循环边界检查最有效的方法是什么,c++,C++,以下两种for循环实现中哪一种应该运行得更快,或者它们相等 这个: for(int i=0; i<objectPtr->bound; i++){ //do something that has no affect on objectPtr->bound } for(inti=0;ibound;i++){ //执行对objectPtr->bound没有影响的操作 } 或者这个: int myBound = objectPtr->bound; for(int i=0

以下两种for循环实现中哪一种应该运行得更快,或者它们相等

这个:

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

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

}
for(inti=0;ibound;i++){
//执行对objectPtr->bound没有影响的操作
}
或者这个:

int myBound = objectPtr->bound;

for(int i=0; i<myBound; i++){
//do something that has no effect on objectPtr->bound or myBound
}
int myBound=objectPtr->bound;
对于(int i=0;ibound或myBound)
}
我的直觉是后者速度更快,但我不理解编译过程中的某些部分会使它们的速度相等。我认为前者必须在每个循环周期进行地址解析,以确定值是否已更改


是否有一些C++语法可以用来让编译器知道值/界限不会改变。我知道Valo让编译器知道值总是有可能改变的,所以我可以使用ObjtPTR>绑定变量的const int来获得编译器不总是检查每个循环迭代的值吗?< /P> < P>mpiler可能会发现

objectPtr->bound
的值在迭代之间不会改变。在这种情况下,它会自动将其提取到变量中,以避免重复查找

无法显式地告诉编译器表达式的值不会更改。如果编译器本身无法检测到它,则可以像以前那样将值复制到变量中


无需将局部变量声明为
const
。编译器可以看到您没有在循环中为变量赋值,并推断其值没有改变。

这取决于“执行某些操作”在编译器和选项等上编写和。如果您想帮助告知编译器绑定没有更改,那么将其声明为非
const
变量并没有特别大的帮助。无论如何,MEASURE.premature优化使用迭代器、stl算法和lambdas。对于实现良好的数据结构,您不能迭代任何faster大于迭代器。绝对不是一个过早的优化问题。这是为了最终用于带有超光谱相机的嵌入式设备。@aaronburns:这是一个过早的优化问题,因为您似乎不知道如何测试它。该循环中发生了什么?与其他任何东西相比,它是否需要很长的时间,使查找变得不精确ime存在于噪音中?您的编译器是否为两个版本生成相同的代码?这是不成熟的,因为您没有表现出任何问题,甚至没有执行过最基本的调查。这也是不成熟的,因为您似乎不知道您的代码在基本级别上是如何工作的(这很好,每个人都从某个地方开始,但这个问题有点幼稚。)“编译器可以看到”的假设在某种程度上与编译器的假设/上下文相矛盾,而编译器的假设/上下文太愚蠢了,边界没有改变。使用
const
(一个原来是
const
的变量)如果UB确实改变了,它允许优化循环,而不需要进一步的数据流分析(C++中的UB是大的优化工具)。.@Cheersandhth.-Alf AFAIK,只有当变量是静态的时,它才是UB。@aaronburns UB表示未定义的行为。基本上,如果某个对象是UB,编译器可以假设它不会发生。@Abacabadabaca:C++11§7.1.6.1/4“除非任何类成员声明了
可变的
(7.1.1)可以修改,在对象的生存期(3.8)内修改
const
对象的任何尝试都会导致未定义的行为”非静态的例子在长度上显示UB也包含动态分配的对象,当该对象最初是代码> const 时,除非你有一个参数表明动态分配的对象是静态的,否则我认为你的观点依赖于不稳定的基础。@ CalthHthh。- Alf You A没错。不过,检测一个局部变量从未被赋值,并且它的地址从未被获取是大多数编译器所能做的,在这种情况下,通过任何方式修改这个变量(比如通过“猜测”它的地址)都是不可能的。