Compiler

Welche Wirkung hat es, wenn auf den letzten rekursiven Aufruf der obigen Funktion die Tail-Call-Optimierung angewendet wird?

int fact(int n, int acc) {
    if (n <= 1) return acc;
    return fact(n - 1, acc * n);
}
  1. ADie Zahl der Rekursionen halbiert sich, und das Ergebnis wird doppelt so schnell berechnet
  2. BDie Funktion wird inline eingesetzt, und die Rekursion selbst wird durch eine Konstante ersetzt
  3. CDer Aufruf wird durch einen Sprung ersetzt, und der Stack wächst auch bei tiefer Rekursion nicht
Antwort und Erläuterung anzeigen

Antwort: C. Der Aufruf wird durch einen Sprung ersetzt, und der Stack wächst auch bei tiefer Rekursion nicht

Der rekursive Aufruf dieser Funktion ist die letzte Operation der Funktion und gibt deren Ergebnis unverändert zurück (Tail Call). Da nach dem Aufruf nichts mehr zu tun bleibt, kann der Stack-Frame der aktuellen Funktion wiederverwendet werden, indem die Argumente überschrieben und an den Funktionsanfang gesprungen wird. Dadurch wirkt es wie eine Schleife, der Stack wächst auch bei beliebig tiefer Rekursion nicht, und ein Überlauf droht nicht. Die Zahl der Rekursionen ändert sich nicht, und da n erst zur Laufzeit feststeht, ist eine Konstante nicht möglich.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Welche Aussage zum Unterschied zwischen Compiler und Interpreter ist richtig?
  2. Welche Eigenschaft einer Laufzeitumgebung mit JIT-Kompilierung ist richtig?
  3. Welche Beschreibung des grundlegenden Aufbaus von LLVM ist richtig?
  4. In welcher Situation wird bei den Optionen zur Wahl der Optimierungsstufe häufig die Einstellung ohne Optimierung (z. B. -O0) verwendet?
  5. Welche Beschreibung der profilgesteuerten Optimierung (PGO) ist richtig?

Vergleiche zu diesem Thema