14

モジュールはテンプレートのコンパイルを高速化しますか? テンプレートは (通常) ヘッダーのみである必要があり、#includer の翻訳単位に存在することになります。

関連: プリコンパイル済みヘッダーはテンプレートのコンパイルを高速化しますか?

4

3 に答える 3

13

モジュールの提案によると、あなたが引用したまさにその論文から、それはモジュールを追加するための3つの主要な目標の最初のものです:

1 はじめに

モジュールは、ライブラリをパッケージ化し、その実装をカプセル化するメカニズムです。これらは、主にすべてのエンティティが 1 つの場所 (クラス、テンプレートなども含む) で定義されているという点で、翻訳単位とヘッダー ファイルの従来のアプローチとは異なります。このホワイト ペーパーでは、次の 3 つの主要な目標を持つモジュール メカニズム (Modula-2 のメカニズムと多少似ています) を提案します。

  • 大規模プロジェクトのビルド時間を大幅に改善
  • インターフェイスと実装をより適切に分離できるようにする
  • 既存のライブラリに実行可能な移行パスを提供する これらは原動力となる目標ですが、この提案は、他の多くの長年にわたる実際的な C++ の問題 (初期化の順序、実行時のパフォーマンスなど) も解決します。

では、どうすればこれらの目標を達成できるのでしょうか? さて、セクション 4.1 から:

通常、ヘッダー ファイルは他の多くのファイルに含まれているため、ビルド サイクルの増加は、ソース コードの総量に対して一般的に超線形です。この問題に対処しないと、テンプレートの使用が増加し、より強力な宣言機能 (概念、コントラクト プログラミングなど) が言語に追加されるにつれて、問題が悪化する可能性があります。

モジュールは、この問題に対処するために、テキスト インクルージョン メカニズム (処理時間は含まれるコードの量にほぼ比例します) をプリコンパイル済みのモジュール アタッチメント メカニズム (適切に実装された場合の処理​​時間は、インポートされた宣言の数にほぼ比例します) に置き換えます。プライベート モジュールの定義が変更されたときにクライアントの翻訳単位を再コンパイルする必要がないというプロパティを保持できます。

つまり、少なくとも、これらのテンプレートの解析にかかる時間は、N 回ではなく 1 回だけで済みます。これはすでに大幅な改善です。

後のセクションでは、明示的なインスタンス化などの改善について説明します。セクション 5.8 で認められているように、これが直接改善しないことの 1 つは、テンプレートの自動インスタンス化です。ここで保証できるのは、プリコンパイル済みヘッダーからすでに得られているものとまったく同じ利点です。しかし、この提案は、ODR 問題に対する可能な技術的解決策をいくつか提供します。少なくともそのいくつかは、複数のインスタンス化の問題も解決するものであり、今日の世界では不可能かもしれません。たとえば、提案されている種類のクエリによるインスタンス化は繰り返し試行されており、現在のモデルで正しく行うのは一般に難しすぎると考えられていますが、モジュールを使用すると実現可能になる可能性があります。という証拠はない」

そして、それは、提案ではまったく述べられていないが、バックグラウンドにある一般的な含意と一致します: コンパイルをよりシンプルにすることは、プロセスで新しい最適化を取得する可能性があることを意味します (何が起こっているのかを推論する方が簡単であるため、直接的に、または間接的には、それほど大きな苦痛でなくなると、より多くの人が問題に取り組みます)。

要約すると、テンプレート定義自体を 1 回だけ解析する必要があるという以外の理由がなければ、モジュールはテンプレートのコンパイルを高速化できるし、確実に高速化します。それらは、モジュールなしでは不可能またはより困難な他の利点を可能にするかもしれませんが、それは保証できないかもしれません.

于 2012-08-03T20:40:23.623 に答える
0

プリコンパイル済みヘッダーはテンプレートのコンパイルを高速化しますか?

いいえ; テンプレートがコンパイルされなくなります。これが、PCH とモジュールの両方の要点です。つまり、すべてのコンパイルを停止することです。

このアイデアは、「C++ テキストをロードしてコンパイルする」を「C++ シンボルをロードする」に変えることです。モジュールは、PCH の一般化された形式です。

テンプレートをインスタンス化するコストはまだかかります(PCH/モジュール内でインスタンス化されていない場合)。ただし、C++ テンプレート コードをコンパイルするコストは取り除かれます。

于 2012-08-03T22:22:37.897 に答える
-1

モジュールについてはわかりませんが、他の多くのコンパイラと同様に、gcc が現在でもプリコンパイル済みヘッダーを提供していることは知っています。プリコンパイル済みヘッダーには、非常に効率的な機械可読バージョンのテンプレート記述を含めることができるため、ヘッダーのインクルード時にそれが利用可能になると、通常はソース テキストのみのコンパイルされていないヘッダーに必要な多くのコンパイル手順をスキップできます。

モジュール ペーパーでは、プリコンパイル済みインターフェイス ファイルについて説明しているため、現在のプリコンパイル済みヘッダーと新しいプリコンパイル済みインターフェイス ファイルは同等のパフォーマンスを提供すると思います。プレーン テキストのポータブル モジュール記述からこのようなファイルを作成すると、言語構文の制限により時間を節約できるため、おそらくより効率的です。また、より標準化されるため、より多くのヘッダーがプリコンパイルの利点を得ることができます。現在のプロジェクトが複数のヘッダーをプリコンパイルすることはめったになく、私の経験ではプロジェクト間でプリコンパイルされたヘッダーはさらにまれです。

于 2012-08-03T21:12:18.240 に答える