12

静的にコンパイルされ、テンプレートのメタプログラミングが一般的な手法である C++ および D 言語では、テンプレートのインスタンス化の肥大化についてかなりの懸念があるようです。非常にリソースに制約のある組み込みシステムを除いて、それは主に理論的な問題のように思えます。埋め込まれた空間の外では、それが実際に問題であったことを誰かが証明できたという例をまだ聞いたことがありません.

テンプレートのインスタンス化の肥大化が実際に重要であり、測定可能で実質的に重大な悪影響があった例を、リソースが大幅に制限された組み込みシステム以外で提供できる人はいますか?

4

5 に答える 5

10

C ++で実行できるテンプレートの量は、その複雑さによって制限されるため、C++ではほとんど問題はありません。

ただし、Dでは... CTFE(コンパイル時関数評価)が存在する前は、文字列処理にテンプレートを使用する必要がありました。これは、大きなマングルシンボルがDMDで圧縮される理由でもあります-テンプレート引数として使用される文字列はマングルシンボル名の一部になり、コードのより長いセグメントでテンプレートをインスタンス化する場合(たとえば)、結果のシンボルサイズはオブジェクトフォーマットを壮大に爆発させます。

最近はもっといいです。しかし、全体として、テンプレートは単純な理由で依然として多くの肥大化を引き起こします-それらはC ++よりも高速に解析され、より強力であるため、人々は自然にそれらをより多く使用します(技術的にテンプレートを必要としない場合でも)。私はここで主な犯罪者の1人であることを認めなければなりません(必要に応じてtools.baseを参照してください。ただし、バーフバッグを手元に置いてください。ファイルは事実上90%のテンプレートコードです)。

于 2009-11-20T19:03:23.313 に答える
7

テンプレートの肥大化は問題ではありません(コードの問題ではなく精神的な問題です)。

はい、大きくなる可能性があります。しかし、代替手段は何ですか?
すべてのコードを自分で手動で作成できます (タイプごとに 1 回)。手動で書くと小さくなると思いますか。コンパイラは実際に必要なバージョンのみをインスタンス化し、リンカはコンパイル単位にまたがる複数のコピーを削除します。

したがって、実際の膨張はありません。
使用するものを構築しているだけです。多くの異なる型を使用する場合は、より多くのコードを記述する必要があります。

于 2009-11-20T17:50:43.430 に答える
3

テンプレート コードが実際に肥大化していることを確認するには、古いコンパイラを見つける必要があると思います。最新の C++ コンパイラ (およびリンカー) は、しばらくの間、最適化を行うことができました。

于 2009-11-20T16:45:06.360 に答える
2

主に精神的疲労だと思います。あなたのコードに取り組む次のプログラマーは、最初にそのコードのどのサブセットが重要かを理解する必要があります。

于 2009-11-20T16:47:18.197 に答える
1

テンプレートインスタンスの肥大化は、コンパイルとリンクの時間が (かなり!!!) 増加する可能性があるため、実際の問題です。

個人的には、c++ #1 の問題はコンパイル時の問題であり、主にテンプレートが原因であると考えています。

私は約 50 のライブラリを含むプロジェクトに取り組みました。テンプレートを使用した独自の rtti システムがありました。テンプレートが肥大化したため、書き直さなければなりませんでした

ここにいくつかの数字があります:

  • ライブラリは 640 メガバイトから 420 メガバイトになりました
  • temps は 4.3 GB から 2.9 GB になりました
  • 完全な再構築は 19:30 から 13:10 になりました
于 2010-06-14T14:23:20.627 に答える