Il me semble que cela fonctionnerait parfaitement pour faire une optimisation de la récursivité de queue en C et C ++, mais pendant le débogage, je ne semble jamais voir une pile de cadres indiquant cette optimisation. C'est plutôt bien, car la pile me dit à quel point la récursivité est profonde. Cependant, l'optimisation serait également très intéressante.
Est-ce que des compilateurs C ++ font cette optimisation? Pourquoi? Pourquoi pas?
Comment dire au compilateur de le faire?
- Pour MSVC:
/O2
ou/Ox
- Pour GCC:
-O2
ou-O3
Que diriez-vous de vérifier si le compilateur a fait cela dans un certain cas?
- Pour MSVC, activez la sortie PDB pour pouvoir tracer le code, puis inspectez le code
- Pour GCC ..?
Je prendrais toujours des suggestions sur la façon de déterminer si une certaine fonction est optimisée comme celle-ci par le compilateur (même si je trouve rassurant que Konrad me dise de l'assumer)
Il est toujours possible de vérifier si le compilateur fait cela du tout en faisant une récursion infinie et en vérifiant si cela se traduit par une boucle infinie ou un débordement de pile (je l'ai fait avec GCC et j'ai découvert que c'était -O2
suffisant), mais je veux être capable de vérifier une certaine fonction dont je sais qu'elle se terminera de toute façon. J'adorerais avoir un moyen facile de vérifier cela :)
Après quelques tests, j'ai découvert que les destructeurs ruinaient la possibilité de faire cette optimisation. Cela peut parfois valoir la peine de changer la portée de certaines variables et temporaires pour s'assurer qu'elles sortent de la portée avant le début de l'instruction return.
Si un destructeur doit être exécuté après l'appel final, l'optimisation de l'appel final ne peut pas être effectuée.