Il s'avère que dans certains compilateurs, avec les bons indicateurs d'optimisation, ce ne sera pas causer un débordement de pile! En fait, j'ai essayé de compiler votre programme en g++
. Avec l'optimisation aux valeurs par défaut, cela provoque un débordement de pile, mais au niveau d'optimisation -O3
, il passe simplement dans une boucle infinie.
La raison pour laquelle il existe une différence entre la récurrence infinie et les boucles infinies est liée à la manière dont le compilateur, par défaut, implémente ces constructions. Les boucles ont historiquement été implémentées en utilisant des instructions de branchement qui indiquent au processeur de prendre en charge l'exécution dans une partie différente du programme. Toutes ces instructions font sauter le compteur de programme ailleurs, ce qui modifie simplement le contenu d'un registre. D'autre part, les appels de fonction sont implémentés en ajoutant un nouvel enregistrement d'activation à la pile pour coder les arguments, l'adresse de retour, etc. de sorte que lorsque la fonction revient, elle sait où retourner. Ceci dit, ce n'est pas "la manière" que des appels de fonction ou des branches doivent être implémentés. Vous pourriez, en théorie, implémenter des boucles en utilisant les appels et les retours de fonctions, bien qu'aucun compilateur ne le fasse. De même, avec les fonctions qui sont récursives à la queue (comme vous le voyez), les compilateurs sont souvent assez intelligents pour éviter toutes les manipulations de pile et les convertir en instructions de branchement naïves pour éviter la surcharge de la pile.En bref, la raison pour laquelle vous obtenez un comportement différent est basée sur la façon dont le compilateur décide d'implémenter le code. S'il est assez intelligent pour voir qu'il n'a pas besoin de faire une configuration d'appel de fonction coûteuse, alors il convertira l'appel en une simple instruction de boucle et boucle pour toujours. S'il ne le détecte pas, il se repliera sur le mécanisme d'appel de fonction naïf.
Salut merci: D. Ceci est une explication très utile et complète, oui c'est à peu près ce qui me préoccupait: à quel point le compilateur pourrait être intelligent dans ces cas-là. – Juste
@ Nicolas- Glad pour aider! BTW, si vous aimez l'une des réponses ici (même si ce n'est pas le mien), vous devriez l'accepter pour que la question soit marquée résolue. – templatetypedef
Fait xD. J'apprends encore à naviguer sur ce site lol. J'ai aimé à peu près toutes les réponses, la vôtre est la plus complète mais merci ^^ – Juste