Parece-me que funcionaria perfeitamente bem na otimização da recursão de cauda em C e C ++, mas durante a depuração, nunca pareço ver uma pilha de quadros que indica essa otimização. Isso é bom, porque a pilha me diz o quão profunda é a recursão. No entanto, a otimização também seria agradável.
Algum compilador C ++ faz essa otimização? Por quê? Por que não?
Como instruo o compilador a fazer isso?
- Para MSVC:
/O2
ou/Ox
- Para o GCC:
-O2
ou-O3
Que tal verificar se o compilador fez isso em um determinado caso?
- Para MSVC, habilite a saída PDB para rastrear o código e, em seguida, inspecione o código
- Para o GCC ..?
Eu ainda aceitaria sugestões de como determinar se uma determinada função é otimizada assim pelo compilador (embora eu ache reconfortante que o Konrad me diga para assumi-la)
Sempre é possível verificar se o compilador faz isso fazendo uma recursão infinita e verificando se isso resulta em um loop infinito ou em um estouro de pilha (fiz isso com o GCC e descobri que -O2
é suficiente), mas quero ser capaz de verificar uma determinada função que eu sei que terminará de qualquer maneira. Eu adoraria ter uma maneira fácil de verificar isso :)
Após alguns testes, descobri que os destruidores arruinam a possibilidade de fazer essa otimização. Às vezes, pode valer a pena alterar o escopo de determinadas variáveis e temporários para garantir que elas fiquem fora do escopo antes do início da instrução de retorno.
Se qualquer destruidor precisar ser executado após a chamada final, a otimização da chamada final não poderá ser realizada.