Compiler

Welche Aussage ist richtig, wenn auf den obigen Code die Eliminierung gemeinsamer Teilausdrücke angewendet wird?

x = (a + b) * c;
y = (a + b) * d;
  1. Aa + b wird nur einmal berechnet, in einer temporären Variablen abgelegt und in den beiden Ausdrücken wiederverwendet
  2. Bx und y sind ähnliche Ausdrücke, daher wird die Berechnung eines von beiden entfernt
  3. CMultiplikationen werden durch Additionen ersetzt, um die Berechnung zu erleichtern
Antwort und Erläuterung anzeigen

Antwort: A. a + b wird nur einmal berechnet, in einer temporären Variablen abgelegt und in den beiden Ausdrücken wiederverwendet

Die Eliminierung gemeinsamer Teilausdrücke ist eine Optimierung, die Ausdrücke mit gleichem Wert, die mehrfach berechnet werden, nur einmal berechnet und das Ergebnis wiederverwendet. In diesem Beispiel wird t = a + b vorab berechnet und mit x = t * c und y = t * d eine Addition eingespart. Es muss jedoch sichergestellt sein, dass a und b zwischen den beiden Ausdrücken nicht überschrieben werden. x und y sind verschiedene Werte, daher kann keiner von beiden entfernt werden. Das Ersetzen von Multiplikationen durch leichtere Operationen ist eine andere Optimierung namens Strength Reduction.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Was wird bei der Entfernung von totem Code (Dead Code Elimination) entfernt?
  2. Welche Kombination aus Vor- und Nachteil des Inlinings von Funktionen ist richtig?
  3. Welche Hauptwirkung von Loop Unrolling (Schleifenentfaltung) ist richtig?
  4. Welche Berechnung in der obigen Schleife ist Ziel der Verschiebung von schleifeninvarianten Ausdrücken (Loop-Invariant Code Motion, aus der Schleife heraus)? (x und y werden in der Schleife nicht verändert.)
  5. Welche Transformation ist richtig, wenn in der obigen Schleife auf die Indexberechnung i * 4 Strength Reduction angewendet wird?

Vergleiche zu diesem Thema