为什么在 C++ 中覆盖比写入慢?

Why in C++ overwritingis is slower than writing?

无用的问题 - 要求删除 我必须 运行 一段代码来管理来自相机的视频流。 我试图提升它,我意识到一个奇怪的 C++ 行为。 (我不得不承认我意识到我不懂 C++)

第一段代码运行比秒还快,为什么?堆栈可能快满了?

更快的版本

double* temp = new double[N];
for(int i = 0; i < N; i++){
    temp[i] = operation(x[i],y[i]);
    res = res + (temp[i]*temp[i])*coeff[i];
} 

较慢的版本1

double temp;
for(int i = 0; i < N; i++){
    temp = operation(x[i],y[i]);
    res = res + (temp*temp)*coeff[i];
}

较慢的版本2

for(int i = 0; i < N; i++){
    double temp = operation(x[i],y[i]);
    res = res + (temp*temp)*coeff[i];
} 

编辑 我意识到编译器正在优化 coefftemp 元素之间的乘积。请原谅这个无用的问题。我会删除这个 post.

这显然与"writing vs overwriting"无关。

假设您的结果确实正确,我可以猜测您的 "faster" 版本可以更有效地由编译器矢量化(即流水线化)。

不同之处在于,在此版本中,您为 temp 分配了存储空间 space,而每次迭代都使用其自己的数组成员,因此所有迭代都可以独立执行。

您的 "slow 1" 版本创建了对单个 temp 变量的(某种)错误依赖。原始编译器可能 "buy" 它,生成非流水线代码。

您的"slow 2"版本实际上似乎没问题,循环迭代是独立的。 为什么这仍然较慢? 我猜这是由于使用了相同的 CPU 寄存器。也就是说,double上的运算通常是通过FPU堆栈寄存器实现的,这是循环迭代之间的干扰。