循环

时间:2017-09-20 15:10:40

标签: c++

我有一个问题:

假设我有以下代码:

代码A:

for (int i = 0; i < n + 1; i++)
{
  // something here
}

代码B:

int lim = n + 1;
for (int i = 0; i < lim; i++)
{
   // something here
}

哪种代码效率更高?代码A中的条件表达式是在for循环的每次迭代中计算的,还是现代编译器会处理它并自己为它赋值?{/ p>

3 个答案:

答案 0 :(得分:5)

这取决于很多因素。如果编译器可以证明n的值在循环的持续时间内没有改变,那么这种优化是合法的。例如,如果n是全局或动态范围内的变量,并且在循环中间有一个函数调用,则编译器通常不会假设调用的函数不会修改全局或动态范围变量。否则,循环的两个版本显然不会相同。

或者,即使变量在本地或自动范围内,并且在附近某处有指针,也可能通过指针修改它,也可能不可能,因此这种优化也不安全。

只有在编译器能够证明优化没有可观察到的变化时,才允许编译器进行与优化相关的代码更改。最后,如果编译器可以证明优化中没有任何可观察到的变化,编译器是否会实现这一点可能取决于编译选项。

答案 1 :(得分:0)

这取决于。

如果在循环内修改了n,则编译器无法优化,条件需要首先评估n+1。如果未修改n,则编译器可以将常量值分配给i的上限。 在A和B中,编译器将检查上限所依赖的变量是否会在循环内被修改。

代码 B 允许您修改循环内的n变量,而不会影响循环的迭代次数。

答案 2 :(得分:0)

这实际上取决于您使用的编译器,它正在使用的优化级别,以及编译器是否可以可靠地判断n的值是否在循环的每次迭代期间保持不变。就个人而言,我会选择 B