Il me semble que l'optimisation de la récursion de queue fonctionnerait parfaitement en C et en C++. Pourtant, lors du débogage, je ne vois jamais de pile de trames indiquant cette optimisation. C'est plutôt une bonne chose, car la pile m'indique la profondeur de la récursion. Cependant, l'optimisation serait également appréciable.
Y a-t-il des compilateurs C++ qui font cette optimisation ? Pourquoi ? Pourquoi pas ?
Comment puis-je demander au compilateur de le faire ?
- Pour MSVC :
/O2
ou/Ox
- Pour le GCC :
-O2
ou-O3
Comment 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 le CCG
Je suis toujours preneur de suggestions sur la manière de déterminer si une certaine fonction est optimisée de cette manière par le compilateur (même si je trouve rassurant que Konrad me dise de le supposer).
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 résulte en une boucle infinie ou un débordement de pile (j'ai fait cela avec GCC et j'ai découvert que -O2
est suffisant), mais je veux pouvoir vérifier une certaine fonction dont je sais qu'elle se terminera de toute façon. J'aimerais avoir un moyen facile de vérifier cela :)
Après quelques tests, j'ai découvert que les destructeurs ruinent la possibilité d'effectuer cette optimisation. Il peut parfois être utile de modifier la portée de certaines variables et temporaires pour s'assurer qu'elles sortent de leur portée avant le début de l'énoncé de retour.
Si un destructeur doit être exécuté après le tail-call, l'optimisation du tail-call ne peut pas être effectuée.