只有当循环中更新的变量是局部变量时,计算才会优化

Computation is optimized only if variable updated in loop is local

本文关键字:局部变量 计算 优化 变量 循环 更新      更新时间:2023-10-16

对于下面的函数,带有优化的代码被向量化,并且在寄存器中执行计算(返回值在eax中返回)。生成的机器代码如下:https://godbolt.org/z/VQEBV4.

int sum(int *arr, int n) {
int ret = 0;
for (int i = 0; i < n; i++)
ret += arr[i];
return ret;
}

然而,如果我将ret设为全局变量(或int&类型的参数),则不使用矢量化,并且编译器将每次迭代中更新的ret存储到内存中。机器代码:https://godbolt.org/z/NAmX4t.

int ret = 0;
int sum(int *arr, int n) {
for (int i = 0; i < n; i++)
ret += arr[i];
return ret;
}

我不明白为什么在后一种情况下会阻止优化(矢量化/寄存器中的计算)。没有线程,甚至增量也不是以原子方式执行的。此外,这种行为在编译器(GCC、Clang、Intel)之间似乎是一致的,所以我相信这一定是有原因的

如果ret不是本地的而是全局的,则arr可能会别名为ret,从而减少优化的机会。