プリコンパイル済みヘッダーの概要
アプリケーションのコンパイル、ビルド、実行:インデックス への移動
C++ プロジェクトでプリコンパイル済みヘッダーを利用すると利点がありますが、プリコンパイル済みヘッダーを作成し使用するときに回避が必要な落とし穴もあります。
プリコンパイル済みヘッダー利用時の利点
プリコンパイル済みヘッダーを作成し使用すると、大きな 2 つの利点があります。
- C++ ファイルのコンパイル時間を短縮できる
- コンパイラで処理する必要があるコード行数を削減できる(場合により、複数桁の規模で異なる)
回避が必要な落とし穴
無制限に使用すると、プリコンパイル済みヘッダーにより実際にコンパイル時間が増加することがあります。 次の潜在的な落とし穴に注意してください。
- 参照するシンボルが非常に少ない単純なコンパイル ユニットではプリコンパイル済みヘッダーがない方がコンパイルが高速になります。 このような場合にプリコンパイル済みヘッダーを使用すると、結果的にコンパイルが遅くなります。
- 定期的に変更されるヘッダーがプリコンパイル済みヘッダーの一部である場合は、プリコンパイル済みヘッダーの定期的な再作成のオーバーヘッドにより、使用した場合のメリットが相殺されることがあります。
- 非常に大きなプリコンパイル済みヘッダーでは、ファイルの読み取りや更新に関連する I/O によりプリコンパイル済みヘッダーのメリットが相殺されることがあります。
一部のヘッダーをプリコンパイル済みヘッダーにインクルードすることは適切ではありません。 以下のガイドラインにしたがって、ヘッダーをプリコンパイルする必要があるかどうかを判断します。
次のタイプのヘッダーをプリコンパイル済みヘッダーにインクルードしない。
- 正しくガードされていない任意のヘッダー。 つまり、ヘッダー ファイルに、複数回インクルードされている場合でも、コンパイラによって 1 回だけ読み込まれることが保証されるプリプロセッサ ガード(#define の使用)が含まれていない。
- 2、3 のコンパイル ユニットのみで定義されている一部のマクロに依存するコードを含むヘッダー。
- 頻繁にまたは定期的に変更されるすべてのヘッダー。
- 任意のデータを含むすべてのヘッダー。 データを含むヘッダーについてのメッセージがコンパイラにより生成され、したがってプリコンパイラ済みヘッダーの一部にできません。
プリコンパイル済みヘッダーは不正なコードを隠すことができます。 たとえば、必要なヘッダー ファイルを明示的にインクルードできない .cpp ファイルは、見つからないヘッダー ファイルをインクルードしているプリコンパイル済みヘッダーを使用すると、コンパイルが可能で、エラーが発生しません。ただしプリコンパイル済みヘッダーを無効にすると失敗します。 ソースに正しくすべての必要なヘッダーがインクルードされていることを確認するために、たまにプリコンパイル済みヘッダーなしでビルドすることをお勧めします。