评估有条件的循环表达

Evaluation of Conditional Expression in for loop

本文关键字:循环 有条件 评估      更新时间:2023-10-16

我有一个查询:

假设我有以下代码:

代码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循环的每次迭代中都计算出来,还是现代编译器照顾它并将其分配为恒定值?

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

或,即使变量在本地或自动范围中,并且附近的某个地方有一个指针,也可能无法通过指针对其进行修改,也可能无法修改该指针,因此此优化也不安全。

只有在编译器可以证明与优化没有可观察到的更改时,允许编译器更改与优化相关的代码更改。最后,如果编译器可以证明将没有任何可观察到的更改,无论是否将实施编译器,这可能取决于编译选项。

它取决于。

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

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

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