我有一个问题:
假设我有以下代码:
代码A:
for (int i = 0; i < n + 1; i++)
{
// something here
}
Run Code Online (Sandbox Code Playgroud)
代码B:
int lim = n + 1;
for (int i = 0; i < lim; i++)
{
// something here
}
Run Code Online (Sandbox Code Playgroud)
哪个代码更有效?代码A中的条件表达式是在for循环的每次迭代中计算的,还是现代编译器会处理它并自己为它分配一个常量值?
这取决于许多因素.如果编译器可以证明n在循环的持续时间内值不会改变,那么这种优化是合法的.n例如,如果是全局或动态范围内的变量,并且在循环中间有一个函数调用,则编译器通常不会假设调用的函数不会修改全局或动态范围的变量.否则,循环的两个版本显然不会相同.
或者,即使变量在本地或自动范围内,并且在附近某处有指针,也可能通过指针修改它,也可能不可能,因此这种优化也不安全.
仅当编译器可以证明优化没有可观察到的变化时,才允许编译器进行与优化相关的代码更改.最后,如果编译器可以证明优化中没有任何可观察到的变化,编译器是否会实现这一点可能取决于编译选项.