私はできるだけCで関数型のプログラムを書こうとしています。 私は、GCC/Clangのようなきれいなコンパイラが黙って呼び出し最適化を行うことは知っていますが、それは保証されていません。コンパイラでテールコールの最適化を強制するオプションはありますか? (当然、それはそれ自身の最後に呼び出されたときだけです)GCC/Clangでテールコールの最適化を強制できますか?
答えて
Clangは最適化を一切行っていません。 LLVMパスtailcallelim
がありますが、それはあなたが望むことをするかもしれませんが(保証されません)。 opt
と別々に実行できます。
optとは何ですか?私はそれのための任意のリンクを持つことができますか? – Eonil
optは、llvm、http://llvm.org/cmds/opt.htmlに同梱されているコマンドラインツールです。 –
また、このパスを明示的に実行するために、clangドライバを調整することもできます。 –
実際には、C用の多くのコンパイラがこれを処理しています。 eqで述べたように、他の場所では動作しない最適化を作成するのではなく、コンパイラでこれらのほとんどの処理を行うことができます。最適化フラグを設定しても、実際にはパフォーマンスの差はないことがよくあります。
メタ答え:
それは関数型言語からCに引き継ぐために便利ですいくつかの教訓があります。小さな関数を使用して、グローバルまたは入力引数のいずれかを変化させません使用機能は、の怯えことはありません関数ポインタ。しかし、あなたがここで合理的にできることには限界があり、テールコールの除去(tail-call 最適化は実際には適切な用語ではありません)に頼っているのはおそらく有用ではありません。コンパイラにこの戦略を強制的に使用させることはできません。たとえできたとしても、結果として得られるCは非常に単調で、将来の自己を含めて他の人にとっては読みにくいでしょう。
強みを発揮する言語を使用します。 C はなので、良いCスタイルのものに使用してください。異なる強みが必要な場合や、機能的なスタイル(優れた決定!)を使用する場合は、機能的な言語を使用してください。
本当にテールコールの場合、whileループやgotoでは再帰呼び出しとは大きく異なります。すべての変数をパラメータとして渡す代わりに更新するだけです。 AFAIKこれは、すべての最適化レベルでスタックの使用を制御するための、Cでの唯一のクロスプラットフォームの方法です。実際には、初期化の後にループが続く関数があるので、実際には読みやすくなります。これはかなり慣用的です。テール再帰バージョンには、初期化用と再帰用の2つの関数が必要です。
- 1. GHCはテールコールでIOアクションを最適化できますか?
- 2. Mathematicaのテールコールの最適化?
- 3. テールコールの最適化javascript
- 4. テールコール再帰的に最適化された式をビルドできますか?
- 5. Pharoはテールコールの最適化を提供していますか?
- 6. チャペルはテールコールの最適化を実装していますか?
- 7. MATLABはテールコールの最適化を実行しますか?
- 8. Fregeはテールコールの最適化を実行しますか?
- 9. array_walk_recursiveはテールコールの最適化を使用しますか?
- 10. テールコール最適化とRAII共存可能?
- 11. JavaScriptテールコールの関数は最適化されていますか?
- 12. プロローグツリーを平坦化するためのテールコールの最適化
- 13. テール再帰のほかにテールコールの最適化?
- 14. ES6クラスの再帰メソッドはTCO(テールコール最適化)を利用しますか?
- 15. 再帰関数の部分的なテールコールの最適化はありますか?
- 16. 特定のメソッドを最適化するようにコンパイラを強制できますか?
- 17. CとHaskellでの相互再帰でのテールコール最適化のコンパイル
- 18. Pythonの制限付き最適化
- 19. Rcppの制約付き最適化
- 20. 制約で最適化するR
- 21. この関数でテールコール最適化を実行するDコンパイラはどれですか?
- 22. boost :: program_options - 強制フラグを強制できますか?
- 23. なぜboost :: multiprecision :: cpp_intを使ってテールコールの最適化に影響を与えるのですか
- 24. ユーザーのマシンで最大化されたウィンドウを強制しますか?
- 25. 誰でもこのSQL文を最適化できますか?
- 26. RDDで複数のパスを最適化できますか?
- 27. 制約付き最適化R:もう一つの例私はR.で制約付き最適化を実行しようとしています
- 28. どのように 'スマート'はGCCのテールコール最適化ですか? forループ</p> <p>:
- 29. PyInstallerでコンパイルを最適化できますか?
- 30. 最適化されていない列の種類を強制的にインデックス化したインデックス付きビュー
コンパイラはこの点ではおそらくスマートですが、信頼してください。ポータブルでないハックの必要はありません。 –
テールの最適化が行われるべきだが、コンパイラが(何らかの理由で)それを行うことができないと思われる場合に、あなたは何をしたいですか? –
@Michael強制的なテールコールの最適化が不可能な場合、私はコンパイル時のエラーが予想されました。 – Eonil