Dies ist eine Frage, die mir beim Lesen der brillanten Antwort von Mysticial auf die Frage in den Sinn kam : Warum ist es schneller, ein sortiertes Array zu verarbeiten als ein unsortiertes Array ?
Kontext für die beteiligten Typen:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
In seiner Antwort erklärt er, dass der Intel Compiler (ICC) dies optimiert:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... in etwas Äquivalentes dazu:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
Der Optimierer erkennt, dass diese äquivalent sind, und tauscht daher die Schleifen aus , wodurch der Zweig außerhalb der inneren Schleife bewegt wird. Sehr schlau!
Aber warum macht es das nicht?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Hoffentlich kann Mysticial (oder sonst jemand) eine ebenso brillante Antwort geben. Ich habe noch nie etwas über die Optimierungen erfahren, die in dieser anderen Frage besprochen wurden, deshalb bin ich wirklich dankbar dafür.
volatile
wären, wäre der Schleifenaustausch ebenfalls eine ungültige Optimierung.