Avatar ·

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