对于以下功能,具有优化功能的代码被矢量化,并且计算在寄存器中执行(返回值在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)之间似乎是一致的,因此我相信一定有原因。
答案 0 :(得分:3)
如果ret
不是本地而是全局的,则arr
可能会别名为ret
,从而减少了优化的机会。