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

StackOverflow https://stackoverflow.com/questions/866840

  •  22-08-2019
  •  | 
  •  

Frage

Wenn dies keine echte Frage fühlen Sie sich frei, um dann zu schließen;)

War es hilfreich?

Lösung

Der Compiler kann die Reihenfolge der Ausführung von Anweisungen ändern, wenn es zu Optimierungszwecken für erforderlich hält, und wenn solche Änderungen nicht das beobachtbare Verhalten des Codes 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 in genau der angegebenen Reihenfolge Code für diese erzeugen. Zuerst berechnet „Ergebnis“ und senden Sie es nur, wenn der ursprüngliche Wert größer als 10 ist (wenn dies nicht der Fall, „Ergebnis“ ignoriert werden würde - berechnet unnötig).

Ein vernünftiger Compiler, würde allerdings sehen, dass die Berechnung des „Ergebnisses“ werden nur benötigt, wenn „Wert“ größer als 10 ist, so kann leicht die Berechnung „Wert * 2“ in den ersten Klammern bewegen und tut es nur, wenn „Wert“ ist tatsächlich größer als 10 (unnötig zu erwähnen, der Compiler nicht wirklich an dem C-Code aussehen, wenn die Optimierung - es funktioniert in der unteren Ebenen).

Dies ist nur ein einfaches Beispiel. Viele komplizierte Beispiele geschaffen werden. Es ist durchaus möglich, dass eine C-Funktion in kompilierter Form, mit aggressiv genug Optimierungen fast nichts, wie seine C Darstellung am Ende aussehen würde.

Andere Tipps

Nicht nur der Compiler kann die Ausführung (meistens für die Optimierung) neu ordnen, die meisten modernen Prozessoren tun es auch. Lesen Sie mehr über die Ausführung Umordnung und Speicherbarrieren .

Viele Compiler verwenden, um etwas „gemeinsame subexpression Beseitigung“ bezeichnet. Zum Beispiel, wenn Sie den folgenden Code haben:

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

Der Compiler würde feststellen, dass y * 15 invariant (sein Wert ändert sich nicht). So wäre es y berechnen * 15, kleben Sie das Ergebnis in einem Register und die Schleifenanweisung ändern "x + = r0 * i". Dies ist eine Art ein konstruiertes Beispiel, aber man oft Ausdrücke wie diese, wenn sie mit Array-Indizes oder einer anderen Basis + Offset Art von Situation zu arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top