質問: プリコンパイル済みヘッダーとは、テンプレートを多用したライブラリなどヘッダーファイルのコード量が多いプログラムに関して、少しでもコンパイル時間の節約をするためにプリコンパイルだけでも終わらせておくという目的があると認識しています。 ということはつまり、やはりコンパイルは必要で、これを共有するという概念がよくわかりません。これは一体どのような状況を指し示しているのでしょうか。あるいは、私のプリコンパイル済みヘッダーに対する認識は間違っていますでしょうか。
回答: プリコンパイルヘッダは `MSVC` と `gcc` で若干実装が異なりますが `MSVC` の場合 コンパイラ(やライブラリ)に付属のヘッダファイルは通常我々末端ユーザーは一切変更しません(変更するとしたらコンパイラ/ライブラリの bug fix アップデータが行うはず)例えば `windows.h` なんて(更に `#include` されているファイルを含めると)数万行に達していますが、変化しない内容を毎回逐次解釈するのは無駄だと思われます。そのため「内容が変わらないであろうシステムのヘッダファイル」であって、「複数個のソースファイルですべて同じように使っているもの」で「コンパイルオプションが同じである場合」は (まあ端的には1プロジェクト内の `windows.h` などが想定されます) 1回コンパイルしたなら、そのコンパイル結果を保存しておけば時間短縮になりそうという発想になります。これがプリコンパイルヘッダです。 `windows.h` を解釈をした結果はコンパイラの作業用メモリに展開されているわけなので、その作業用メモリをそのままファイルに保存しようってのが Microsoft Visual C/C++ のプリコンパイルヘッダです(だからやたらとサイズがでかい:ソースを再解釈するよりでかいファイルをファイルキャッシュから読むほうが速いはずという発想) というわけで「共有する」とはこの場合「同じヘッダファイルであって内容が変化しないもの」に限られます。プログラマが自分で作るヘッダファイルは内容が変化していくはずなのでプリコンパイルヘッダには盛り込まないのが普通です。