Por que a adição elemento a elemento em dois loops separados é mais rápida do que em um único loop combinado?
Olá a todos! Estou programando em C++ há alguns meses e me deparei com um comportamento de desempenho muito estranho. Tenho dois arrays: `a` e `b` com 200.000.000 de elementos (cerca de 800 MB cada). Quero somá-los elemento a elemento e armazenar o resultado no array `c`, e então multiplicar cada elemento de `c` por 2 e armazenar em `d`.
Escrevi duas variantes de código:
**Variante 1 (dois loops separados):**
```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;
}
```
**Variante 2 (um único loop combinado):**
```cpp
for (int i = 0; i < n; ++i) {
c[i] = a[i] + b[i];
d[i] = c[i] * 2;
}
```
Eu esperava que a segunda variante fosse mais rápida, pois faz tudo em uma única passada. Mas na prática (compilador MSVC, flags /O2, arquitetura x64) a primeira variante é **quase duas vezes mais rápida**! Por que isso? Afinal, na segunda variante há menos operações com índices e menos verificações de limites. Expliquem, por favor, o que está acontecendo nos bastidores. Isso está relacionado