5

問題は、Visual Studio コンパイラによって作成された .pch バイナリの内容に関するものです。何が含まれていますか?ヘッダー ファイルの解析済みツリーのみですか、それともオブジェクト コードですか?

次の例を検討してください。

// myheader.h
#include <vector>
class A {
public:
  void add(int i) { v.push_back(i); }
private:
  std::vector<int> v;
};

プリコンパイルされるセットにこのヘッダーを含めると、コンパイルされて .pch に追加される vector<int> の完全なテンプレート インスタンス化が発生しますか?

もう少し文脈を与えるために; 解析ツリーのみがプリコンパイルされている場合、これは、インスタンス化されたテンプレートのオブジェクト コードがコンパイル ユニットごとに 1 回作成され、結果としてコンパイルおよびリンク時間が増加することを意味します。したがって、「ユニティ ビルド」/コンパイル ユニットの削減は、プリコンパイル済みヘッダーが有効になっている場合でも、ビルド時間を短縮する上で重要な要素となります。

4

1 に答える 1

1

PCHの内部については一概には言えませんが、ユニティビルドに関してはvector<int>、PCHにフルインスタンス化されたとしても、ユニティビルドのほうが有利だと思います。

ご存じのとおり、C++ は 1 つの定義規則 (ODR) を維持する必要があります。リンカーは、各オブジェクト ファイルに散らばっているテンプレートの定義を 1 つにまとめる必要があります。
つまり、大まかに言えば、C++ は次のことを行う必要があります。

  1. テンプレートをインスタンス化する
  2. オブジェクトファイルの書き込み
  3. リンク用のオブジェクト ファイルを再読み込み
  4. ODR の解決

Unity ビルドを使用すると、上記の負荷をある程度節約できます。
ただし、上記の節約が、あなたの環境で PCH を使用する非 Unity コンパイル システムを上回るとは言えません。

于 2011-01-21T14:10:08.793 に答える