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; }
- ADurch Eliminierung gemeinsamer Teilausdrücke ruft g die Funktion sq zweimal auf
- BDurch Constant Folding wird g zu einem Code, der nur 37 zurückgibt
- 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.