8

検索しようとしましたが、見つけることができませんでした: gcc が末尾再帰を最適化するための関数の要件は何ですか? 最も重要なケースを含む参照またはリストはありますか? これはバージョン固有であるため、私の関心は 4.6.3 以降のバージョンです (新しいほど良い)。ただし、実際には、具体的な参考資料は大歓迎です。

前もって感謝します!

4

1 に答える 1

14

有効に-O2すると、可能であれば、gcc は末尾呼び出しの最適化を実行します。さて、問題は次のとおりです。それはいつ可能になりますか?

(単一の) ステートメントの直前または内部で再帰呼び出しが発生するたびに、単一の再帰呼び出しを排除することができるためreturn、後で別の値を返す可能性以外に目に見える副作用はありません。これには、三項演算子を含む式を返すことが含まれます。return 式にいくつかの再帰呼び出しがある場合でも (よく知られているフィボナッチの例: など)、末尾呼び出し再帰は引き続き適用されますが、最後の再帰呼び出しに対してのみ適用される
ことに注意してください。return (n==1) ? 1 : fib(n-1)+fib(n-2);

明らかな特殊なケースとして、再帰関数 (およびその引数) が定数式として適格であることをコンパイラが証明できる場合、(構成可能な最大再帰深度まで、デフォルトでは 500 まで) 末尾呼び出しだけでなく、全体の呼び出しを削除できます。関数の実行。これは、リテラル-O2などの特定のライブラリ関数の呼び出しを含む、GCC が で定期的かつ非常に確実に行うことです。strlen

于 2013-04-09T10:04:49.913 に答える