3 Stimmen

Unter welchen Umständen kann ein Compiler die Ausführungsreihenfolge von Programmanweisungen ändern?

Wenn dies der Fall ist keine echte Frage dann können Sie es gerne schließen ;)

9voto

lothar Punkte 19157

Nicht nur der Compiler kann die Ausführung neu ordnen (meist zu Optimierungszwecken), auch die meisten modernen Prozessoren tun dies. Lesen Sie mehr über die Neuordnung der Ausführung und Speicherbarrieren .

5voto

Hexagon Punkte 6527

Der Compiler kann die Ausführungsreihenfolge von Anweisungen ändern, wenn er dies zu Optimierungszwecken für angebracht hält und wenn solche Änderungen das beobachtbare Verhalten des Codes nicht verändern würden.

Ein sehr einfaches Beispiel -

int func (int value)
{
    int result = value*2;
    if (value > 10)
    {
       return result;
    }
    else
    {
       return 0;
    }
}

Ein naiver Compiler kann hierfür Code in genau der gezeigten Reihenfolge erzeugen. Berechnen Sie zunächst das "Ergebnis" und geben Sie es nur zurück, wenn der ursprüngliche Wert größer als 10 ist (andernfalls würde das "Ergebnis" ignoriert und unnötig berechnet).

Ein vernünftiger Compiler würde jedoch erkennen, dass die Berechnung von "result" nur dann erforderlich ist, wenn "value" größer als 10 ist, und die Berechnung von "value*2" einfach in die erste geschweifte Klammer verschieben und nur dann durchführen, wenn "value" tatsächlich größer als 10 ist (unnötig zu erwähnen, dass der Compiler nicht realmente Schauen Sie sich den C-Code bei der Optimierung an - er funktioniert auf niedrigeren Ebenen).

Dies ist nur ein einfaches Beispiel. Es lassen sich noch viel kompliziertere Beispiele erstellen. Es ist durchaus möglich, dass eine C-Funktion in kompilierter Form fast gar nicht mehr so aussieht wie ihre C-Darstellung, wenn sie aggressiv genug optimiert wird.

4voto

TMN Punkte 3032

Viele Compiler verwenden die so genannte "Common Subexpression Elimination". Zum Beispiel, wenn Sie den folgenden Code haben:

for(int i=0; i<100; i++) {
    x += y * i * 15;
}

würde der Compiler feststellen, dass y * 15 ist invariant (sein Wert ändert sich nicht). Es würde also y * 15 berechnen, das Ergebnis in ein Register stecken und die Schleifenanweisung in "x += r0 * i" ändern. Dies ist ein etwas konstruiertes Beispiel, aber man sieht solche Ausdrücke oft, wenn man mit Array-Indizes oder anderen Basis + Offset-Situationen arbeitet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X