Mi sembra che funzionerebbe perfettamente per l'ottimizzazione della ricorsione della coda sia in C che in C ++, ma durante il debug non sembra mai vedere uno stack di frame che indica questa ottimizzazione. Questo è abbastanza buono, perché lo stack mi dice quanto è profonda la ricorsione. Tuttavia, anche l'ottimizzazione sarebbe piacevole.
Alcuni compilatori C ++ eseguono questa ottimizzazione? Perché? Perchè no?
Come faccio a dire al compilatore di farlo?
- Per MSVC:
/O2
o/Ox
- Per GCC:
-O2
o-O3
Che ne dici di verificare se il compilatore lo ha fatto in un determinato caso?
- Per MSVC, abilitare l'output PDB per poter tracciare il codice, quindi ispezionare il codice
- Per GCC ..?
Prenderò comunque suggerimenti su come determinare se una determinata funzione è ottimizzata in questo modo dal compilatore (anche se trovo rassicurante che Konrad mi dica di assumerlo)
È sempre possibile verificare se il compilatore lo fa eseguendo una ricorsione infinita e verificando se si traduce in un loop infinito o in uno stack overflow (l'ho fatto con GCC e ho scoperto che -O2
è sufficiente), ma voglio essere in grado di controllare una determinata funzione che so terminerà comunque. Mi piacerebbe avere un modo semplice per controllare questo :)
Dopo alcuni test, ho scoperto che i distruttori rovinano la possibilità di effettuare questa ottimizzazione. A volte può valere la pena cambiare l'ambito di determinate variabili e temporali per assicurarsi che escano dall'ambito prima dell'inizio dell'istruzione return.
Se è necessario eseguire un distruttore dopo la coda, non è possibile eseguire l'ottimizzazione della coda.