只有当循环中更新的变量是局部变量时,计算才会优化
Computation is optimized only if variable updated in loop is local
对于下面的函数,带有优化的代码被向量化,并且在寄存器中执行计算(返回值在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
,从而减少优化的机会。
相关文章:
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 在c++上创建税务计算程序,错误为未初始化的局部变量
- 只有当循环中更新的变量是局部变量时,计算才会优化
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- 在计算函数返回值之前或之后是否销毁了局部变量