Me parece que funcionaría perfectamente bien para hacer una optimización de recursión de cola tanto en C como en C ++, aunque durante la depuración nunca parece ver una pila de cuadros que indique esta optimización. Eso es bastante bueno, porque la pila me dice cuán profunda es la recursión. Sin embargo, la optimización también sería agradable.
¿Algún compilador de C ++ hace esta optimización? ¿Por qué? Por qué no?
¿Cómo hago para decirle al compilador que lo haga?
- Para MSVC:
/O2
o/Ox
- Para CCG:
-O2
o-O3
¿Qué tal verificar si el compilador ha hecho esto en cierto caso?
- Para MSVC, habilite la salida PDB para poder rastrear el código, luego inspeccione el código
- Para GCC ..?
Todavía tomaría sugerencias sobre cómo determinar si una determinada función está optimizada de esta manera por el compilador (aunque me parece tranquilizador que Konrad me diga que asuma)
Siempre es posible verificar si el compilador hace esto haciendo una recursión infinita y verificando si resulta en un bucle infinito o un desbordamiento de pila (hice esto con GCC y descubrí que -O2
es suficiente), pero quiero ser capaz de verificar una determinada función que sé que terminará de todos modos. Me encantaría tener una manera fácil de verificar esto :)
Después de algunas pruebas, descubrí que los destructores arruinan la posibilidad de hacer esta optimización. A veces puede valer la pena cambiar el alcance de ciertas variables y temporales para asegurarse de que se salgan del alcance antes de que comience la declaración de retorno.
Si algún destructor necesita ejecutarse después de la llamada de cola, la optimización de la llamada de cola no se puede hacer.