C'est une question qui m'est venue à l'esprit en lisant la brillante réponse de Mysticial à la question: pourquoi est-il plus rapide de traiter un tableau trié qu'un tableau non trié ?
Contexte des types concernés:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
Dans sa réponse, il explique que le compilateur Intel (ICC) optimise ceci:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... en quelque chose d'équivalent à ceci:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
L'optimiseur reconnaît que celles-ci sont équivalentes et échange donc les boucles , déplaçant la branche hors de la boucle interne. Très intelligent!
Mais pourquoi ne fait-il pas cela?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Espérons que Mysticial (ou n'importe qui d'autre) puisse donner une réponse tout aussi brillante. Je n'ai jamais entendu parler des optimisations évoquées dans cette autre question auparavant, donc j'en suis vraiment reconnaissant.
volatile
, alors l'échange de boucle serait également une optimisation invalide.