2009-03-27 18 views
37

プリコンパイル済みヘッダーファイルの最適な候補は何ですか?テンプレートを持っていても、そこにSTLとBoostヘッダを置くことはできますか?コンパイル時間を短縮できますか? また、コンパイル時間を短縮する最も良いIDE設定は何ですか?プリコンパイル済みのヘッダーには何を入れますか? (MSVC)

+3

PCHを使用しないことをお勧めします。理由は、(1)最初のインクルードが対応するヘッダーであることがわかっているので、ヘッダを知っていることを知っている(2)pchでの依存関係が完全に信頼できるものではなく、インクリメンタルビルドが信頼できなくなる非常に大規模なプロジェクトでは私の意見では、pchを使わないでバランスの取れた方が効率的で、信頼性の高いインクリメンタルビルドのメリットを享受できます。これは、もはや最新のVisual Studioバージョンでは当てはまらないかもしれません。その経験はまだ十分ではありません。 – Permaquid

答えて

47

クイックアンサー:これらのヘッダーファイルでテンプレートクラスが定義されていても、STLとBoostヘッダーは実際にプリコンパイル済みヘッダーファイルに属します。

プリコンパイル済みのヘッダーファイルを生成するとき、コンパイラはヘッダーテキスト(重要なタスク)を解析し、コンパイラの利益に合わせて最適化されたバイナリ形式に変換します。

他の.cppファイルがコンパイルされたときにテンプレートクラスがインスタンス化されても、プリコンパイル済みヘッダーの情報からインスタンス化されます。


(後で追加)あなたが ないがプロジェクトの一部であり、一つ一つの.CPPファイルが含まれていても、頻繁に変更されたファイルをプリコンパイル済みヘッダーに含まれている必要があります

一つのことこれらのファイル。

これは、boost、stl、およびwindowsライブラリが非常に大きいため、プリコンパイル済みヘッダーの生成に時間がかかることが原因です。

すべてが使用する単純なファイル(「StringDefs.h」など)があるとします。 StringDefs.hがstdafx.hに含まれていて、1人の開発者がStringDefs.hに触れている場合、すべての開発者はのプリコンパイル済みヘッダーが再コンパイルするまで待つ必要があります。 StringDefs.hがプリコンパイルされたヘッダーから除外され、各.CPPファイルとともに解析されると、はるかに高速になります。

+0

それは公正な点です。頻繁にファイルを変更するなど、ビルド時間が全体的に遅くなります。 – Andy

+4

.cppファイルごとに1つのプリコンパイル済みヘッダーファイルのみを持つことができますが、複数のプリコンパイル済みヘッダーをプロジェクトに含めることができます。 –

+1

PCHが再コンパイルされるのを待つだけでなく、それを使用するすべてのファイルに対しても待機する必要があります。 –

-1

プリコンパイル済みのヘッダーには、そのプロジェクトのほとんどの.cppファイルに含めるものを入れます。これは実際にはどのヘッダファイルにも当てはまります。これにより、コンパイラはこれらのファイルを一度解析し、同じプロジェクト内のすべての.cppファイルでその情報を再利用することができます。

+2

私はそれに同意せず、理由を説明するために私の返信に特別なセクションを書いています。 –

+0

プリコンパイルされたヘッダーはプロジェクトローカルヘッダーを含めるべきではありません – Tom

+0

私はこの誤ったアドバイスに従ったプロジェクトで広く働いており、非常に非効率的です - コンパイルするたびに、 – Permaquid

6

Andrew Shepherdの答えに1つ追加されました。頻繁に変更されないファイルに対しては、プロジェクトの外部にあるヘッダーファイルのプリコンパイル済みヘッダーを使用します。現在のプロジェクトのヘッダーファイルを常に変更している場合、おそらくそれらをプリコンパイルする価値はありません。

3

私は、コンパイル時間を短縮する技術に関する記事を書いています。これらの技術の中で、プリコンパイルされたヘッダのポストとそのアプリケーションは、hereで見つけることができます。また、面白いと思われるベストプラクティスに関するセクションもあります。それを透過的に処理するCMakeスクリプトが含まれています。

関連する問題