11

私は可能な限り C で関数型のプログラムを書こうとしています。GCC/Clang のような優れたコンパイラが末尾呼び出しの最適化を黙って行うことは知っていますが、それは保証されていません。コンパイラで末尾呼び出しの最適化を強制するオプションはありますか? (もちろん、それ自体の最後に呼び出された場合のみ)

4

7 に答える 7

5

Clang は最適化をまったく行っていません。あなたが望むことをするかもしれないLLVMパスtailcallelimがあります(しかし、それは保証されていません)。で個別に実行できますopt

于 2011-01-24T17:41:45.130 に答える
0

実際には、C 用の多くのコンパイラが既にこれを処理しています。eq が述べたように、他の場所では機能しない最適化を作成しようとするのではなく、コンパイラーにこれらのほとんどを処理させることもできます。多くの場合、最適化フラグを設定しても実際にはパフォーマンスの違いがないことがわかります。

于 2011-01-24T17:41:21.047 に答える
-1

それが本当に末尾呼び出しである場合、while ループまたは goto は、再帰呼び出しとそれほど変わらないように見えます。変数をパラメーターとして渡すのではなく、すべての変数を更新するだけです。私の知る限り、これは C ですべての最適化レベルでスタックの使用を制御する唯一のクロスプラットフォームの方法です。初期化の後にループが続く 1 つの関数があるため、実際にはより読みやすくなります。これはかなり慣用的です。末尾再帰バージョンには、初期化用と再帰部分用の 2 つの関数が必要です。

于 2016-01-20T17:09:12.847 に答える