CとC ++の両方で末尾再帰の最適化を行うことは完全にうまくいくように思えますが、デバッグ中は、この最適化を示すフレームスタックが表示されないようです。スタックが再帰の深さを教えてくれるからです。ただし、最適化も同様によいでしょう。
C ++コンパイラーはこの最適化を行いますか?どうして?何故なの?
コンパイラーに指示する方法を教えてください。
- MSVCの場合:
/O2
または/Ox
- GCCの場合:
-O2
または-O3
コンパイラが特定のケースでこれを行ったかどうかを確認するのはどうですか?
- MSVCの場合、PDB出力がコードをトレースできるようにしてから、コードを検査します
- GCC ..?
特定の関数がコンパイラーによってこのように最適化されているかどうかを判断する方法については引き続き提案します(Konradがそれを想定するように指示していることを確信しているにもかかわらず)
無限再帰を行って無限ループまたはスタックオーバーフローが発生するかどうかを確認することで、コンパイラーがこれを実行するかどうかを常に確認することができます(GCCでこれを実行し、それで-O2
十分であることがわかりました)。とにかく終了することがわかっている特定の機能をチェックできます。これをチェックする簡単な方法が欲しいです:)
いくつかのテストの後、デストラクタがこの最適化を行う可能性を台無しにしていることを発見しました。特定の変数と一時オブジェクトのスコープを変更して、return-statementが始まる前にスコープから外れるようにすることは、価値がある場合があります。
末尾呼び出しの後にデストラクタを実行する必要がある場合、末尾呼び出しの最適化は実行できません。