2017-01-11 15 views
6

Wikiの参考文献には、ときどき大量のソースコードが含まれている可能性があることが記載されています。 https://en.wikipedia.org/wiki/Precompiled_headerプリコンパイルされたヘッダとプリコンパイルされたバイナリの違い

プリコンパイルされたヘッダーにコンパイルされたソースコードが含まれている場合、どのようにプリコンパイルされたバイナリと違うのですか?

+3

プリコンパイルされていないバイナリのようなものはありません。そのため、「プリコンパイルされたバイナリ」の概念は、最初は他のものと比較することではありません。 – EJP

+0

指摘してくれてありがとう...私はそれがプリコンパイルされたソースとして呼び出されるべきだと思う。 – bharath

答えて

2

C++は「翻訳単位」という概念を定義しています。翻訳単位は、翻訳が開始されるアンカーポイントであり、プログラムは、通常、そのような複数の翻訳単位を含む。どの単位が "翻訳単位"としてコンパイラに渡されるかは、実際にはIDEの設定、メイクファイル、およびその他の設定によって決まります。しかし、非公式にはほとんどの設定で.cpp.c - ファイルが翻訳単位になります。

翻訳単位をコンパイラがバイナリにするものと考えることができます。リンカは、複数のバイナリを結合してプログラムにします。

したがって、ヘッダーファイルは通常、翻訳単位として構成されていないため、通常はソースコードが含まれていても、独自のバイナリを生成しません。彼らはむしろ翻訳単位から輸入されると考えられており、翻訳単位とともにまとめられます。

このようなヘッダーファイルは、いくつかの翻訳単位に含まれる多くのソースコードを含んでいれば、それらを一度コンパイルしてできるだけ多くの情報を中間結果に保存することが理にかなっています実際の翻訳単位をコンパイルする方が高速です。これは時間を節約しますが、「中間バイナリ」は内部的なものであり、公開されていないものです。

ただし、内容とソースコードの種類から、ヘッダーファイルは他のソースコードファイルと区別できません。 "ヘッダーファイル"を翻訳単位としてコンパイラに渡すことができます。コンパイラは実際には "通常の"バイナリを作成します。実際には、コンパイルのルートとして宣言されていないのが本当です。

希望に役立ちます。

1

コンパイルされたソースと比較して、プリコンパイルされたヘッダーに格納される情報が多くなります。 ソースをバイナリにコンパイルすると、定義とテンプレートに関する情報が失われます。それらの値に消滅することを定義し、テンプレートはバイナリにインスタンス化された形式でしか取得しません。あらかじめコンパイルされたヘッダーは、あらかじめコンパイルされたヘッダーがどこかに含まれていれば、必要なときに汎用テンプレートの情報と、定義の名前と値を保持します。 純粋なソースのプリコンパイル済みヘッダーは、コンパイル済みソースと同じです。

+0

"純粋なソースプリコンパイルされたヘッダーがコンパイルされたソースと同じです。" .pchファイルが作成されると、ソースコード部分が直接バイナリ形式に変換されると仮定できますか? – bharath

+1

最初に:インライン関数の横にヘッダーファイルに実際のコードは存在しないはずです。インラインのものは、おそらく実際のバイナリに変換され、使用場所にコピーされます。ヘッダファイルのコードの中で最も顕著な部分である関数のようなマクロやテンプレートのようなものは、引数に依存するためバイナリコードには転送できません。 – user6556709

関連する問題