Compilateurs

Quel effet produit l'optimisation des appels terminaux appliquée au dernier appel récursif de la fonction ci-dessus ?

int fact(int n, int acc) {
    if (n <= 1) return acc;
    return fact(n - 1, acc * n);
}
  1. ALe nombre de récursions est divisé par deux et le résultat est obtenu deux fois plus vite
  2. BLa fonction est développée en ligne et la récursion elle-même est remplacée par une constante
  3. CL'appel est remplacé par un branchement (saut), et la pile ne croît pas même pour une récursion profonde
Afficher la réponse et l'explication

Réponse : C. L'appel est remplacé par un branchement (saut), et la pile ne croît pas même pour une récursion profonde

L'appel récursif de cette fonction est le dernier traitement de la fonction et son résultat est renvoyé tel quel (appel terminal). Aucun traitement ne restant après l'appel, il peut être transformé en réutilisation du cadre de pile courant, avec réécriture des arguments et saut au début de la fonction. Le comportement devient celui d'une boucle : la pile ne croît pas quelle que soit la profondeur de récursion et il n'y a plus de risque de débordement. Le nombre de récursions ne change pas, et n étant déterminé à l'exécution, le résultat ne peut pas devenir une constante.

S'entraîner sur ce thème Retour au thème

Autres questions sur Compilateurs

  1. Quelle différence entre compilateur et interpréteur est correcte ?
  2. Quelle caractéristique d'un environnement d'exécution utilisant la compilation JIT est correcte ?
  3. Quelle est l'architecture de base de LLVM ?
  4. Dans quelle situation utilise-t-on souvent l'option de niveau d'optimisation désactivant l'optimisation (-O0, etc.) ?
  5. Quelle définition de l'optimisation guidée par profil (PGO) est correcte ?

Comparatifs sur ce thème