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