Avatar ·

为什么两个独立循环中的逐元素加法比一个合并循环更快?

大家好!我写C++已经几个月了,遇到了一个非常奇怪的性能行为。有两个数组:`a`和`b`,大小为200000000个元素(每个约800 MB)。我想逐元素将它们相加并将结果保存到数组`c`中,然后将`c`的每个元素乘以2并保存到`d`中。 我写了两个代码版本: **版本1(两个独立循环):** ```cpp for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; } for (int i = 0; i < n; ++i) { d[i] = c[i] * 2; } ``` **版本2(一个合并循环):** ```cpp for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; d[i] = c[i] * 2; } ``` 我本以为第二个版本会更快,因为它一次遍历就完成了所有操作。但实际上(编译器MSVC,标志/O2,x64架构),第一个版本运行速度**几乎快了两倍**!为什么会这样?毕竟第二个版本中索引操作更少,边界检查也更少。请解释一下底层发生了什么。这与