Compiler

Welche Optimierung greift im obigen Code nach dem Inlining von sq, und welches Ergebnis ist richtig?

static int sq(int v) { return v * v; }
int g(void) { return sq(6) + 1; }
  1. ADurch Eliminierung gemeinsamer Teilausdrücke ruft g die Funktion sq zweimal auf
  2. BDurch Constant Folding wird g zu einem Code, der nur 37 zurückgibt
  3. CDurch Loop Unrolling wird v * v durch sechs Additionen ersetzt
Antwort und Erläuterung anzeigen

Antwort: B. Durch Constant Folding wird g zu einem Code, der nur 37 zurückgibt

Wird sq inline eingesetzt, lautet der Rumpf von g return 6 * 6 + 1;, und alle Operanden der Multiplikation sind Konstanten. Anschließendes Constant Folding berechnet 6 * 6 = 36 und 36 + 1 = 37, sodass g zu einem Code wird, der nur 37 zurückgibt. Der große Vorteil des Inlinings liegt nicht nur im entfallenden Aufrufaufwand, sondern auch darin, dass Optimierungen mit Werten der aufrufenden Seite möglich werden. Hier gibt es keine Schleife, und sq wird auch nicht zweimal aufgerufen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Welche Beschreibung von Software Pipelining ist richtig?
  2. Warum ordnet ein Compiler bei strenger Einstellung die Gleitkommaaddition (a + b) + c nicht eigenmächtig zu a + (b + c) um?
  3. Welche Befehlsart wird bei der automatischen Vektorisierung des Compilers verwendet?
  4. Welche grundlegende Bedingung muss die Optimierung eines Compilers einhalten?
  5. Welche Beschreibung der Befehlsauswahl (Instruction Selection), einer Phase der Codeerzeugung, ist richtig?

Vergleiche zu diesem Thema