评估有条件的循环表达
Evaluation of Conditional Expression in for loop
我有一个查询:
假设我有以下代码:
代码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 。
相关文章:
- 如何使用 soong 命名空间来有条件地编译模块
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 具有迭代器和自定义步长的循环结束条件
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 有条件的打印和计数在 std::map 上有限制
- 如何在 c++ 中有条件地包含标头?
- 如何仅在Qt是用ltcg构建时才有条件地启用ltcg?
- 当循环在条件C++之前停止工作时
- 如何在Visual Studio 2019中有条件地编译c++源文件
- C++可以有条件地向下转换类指针吗
- for循环的条件只有在遇到断点后才生效
- 使用 SFINAE 有条件地解析分配器成员
- 优雅的方式,将初始化器移动到有条件的循环后面
- 评估有条件的循环表达
- 循环中的有条件语句混淆
- 有条件地控制 for 循环方向的最佳方法是什么
- 有条件的大平面数组遍历和令人惊讶的短循环执行时间
- 是否定义有一个随机的循环终止条件?