2016-12-13 7 views
7

#include <file>は、コンパイルする前にC++プリプロセッサでソースファイルに「file」をペーストしてコピーすることを読んでいます。#include <iostream> C++で?

これは、ソースファイルをコンパイルする限り、「ファイル」(iostream)も何度も何度もコンパイルされることを意味しますか?

また、C++の処理後、中間ファイルのサイズも "file" + "size of source file"のバイト数になりますか?

+0

同じトピックについての以前の質問は、あなたに多くの助けをすることができますhttp://stackoverflow.com/questions/22645097/what-does-include-iostream-do – AurA

+0

[preprocessor](https:// gcc .gnu.org/onlinedocs/cpp /)(これはCとC++ではほぼ同じですが、設定が異なっています)。 [GCC](http://gcc.gnu.org/)(例えば 'G ++')コンパイラを使用している場合は、[プリプロセッサオプション]を、それを渡すことができます(https://gcc.gnu.org/onlinedocs/gcc/Preprocessor- (実際にどのヘッダが含まれているかを理解するため)、 '-C -E'を使って前処理された形式を得る –

+0

" [前方宣言](http://stackoverflow.com/質問/ 553682/i-use-for-forward-declaration) "ヘッダー、特に[' iosfwd'](http://stackoverflow.com/questions/4300696/what-is-the-iosfwd-header)これは縮小サイズのiostreamのようなもので、完全なiostreamファイルの詳細がすべて必要ないときに便利です。 –

答えて

12

私は#include <file>が ペースト「ファイル」をコピーすることを読んで がコンパイルされる前に、C++プリプロセッサによってソースファイルに書き込まれます。

はい。コンパイラに表示されるデータは、fileのデータとソースファイルのデータで構成されます。 (実際には、実際のコンパイラは、これらの日は、Cプリプロセッサとコンパイラのフロントエンドをマージする傾向があり、コンパイラが戻って単一のプログラムに終わる - 。しかし、それはかなり詳細である)

これは、「ファイルことを意味しています"(iostream)も再びコンパイルされます ソースファイルをコンパイルする限り

はい。いくつかのコンパイラには "pre-compiled headers"と呼ばれる機能があり、一度にたくさんのヘッダをコンパイルして、それを複数回使用することができます。どのようにこれを行うかはコンパイラによって異なります。移植性が必要な場合は、心配しないでください(と大きな違いがあります)。

また、中間ファイルのサイズも は "file" + "size of source file"のバイトを持ちますか?

いいえ。出力ファイルのサイズは、ソースファイルのサイズに非常に弱く関連しています。たとえば、#include <iostream>は、多くの場合、多くのインライン関数を定義します。特定のプログラムはそれらのうちのほんの一部しか使用しないので、コンパイラの出力から省略されます。

出力(ソースファイル内のスペースを使用する)は出力には表示されません。

一方、複雑なテンプレートを作成し、いくつかの異なるタイプのインスタンスを作成すると、出力には各タイプのテンプレートの異なるコピーが含まれ、入力よりかなり大きい場合があります。

+0

Shubhamがここに書いたのは... 77バイトのhello worldコードを書いたことです...前処理されたコードのサイズは428282バイトでした.assemblyバージョンは1745バイト、オブジェクトコードは2480バイトでした.iostreamヘッダファイルのサイズは何ですか? –

+0

iostream自体は非常に小さいと思われますが、他にもたくさんのファイルが含まれています。 –

0

No.libraries(ヘッダ)ちょうどあなたがあなたのコードにコード内で使用して物事を追加し、コンパイラがあなたのcode.Itへのヘッダーのすべてを追加していないためファイルのサイズを増加させない、

+0

それはあなたのコンパイラの質に大きく依存します... – BoBTFish

+0

あなたが使用するヘッダーからの関数の数。 –

3

中間ファイルサイズのサイズについては、それが増加します。あなたは具体的には、シンプルなハローワールドプログラムを書き込むことによってこれを確認してから、次のようにする(Linuxに)それをコンパイル

g++ name.cpp -o name --save-temps 

これは、中間ファイルを保存することができます。

"name.ii" (Preprocessed code after including <iostream> 
"name.s" (Assembly version of the code) 
"name.o" (Object code) 

は、このサイズの違いをチェック使用してファイル:

ls -l name.cpp name.ii 
+0

郵便番号。 #includeファイルはコンパイルする必要があります(この場合、出力ファイルが含まれていない場合は出力ファイルは*存在しません)、または必須ではありません(この場合、#includeに驚かれるでしょう)。 .oファイルのサイズを増やすことができました - はい、私は反例を作れますが、かなり人工的です)。 –

+0

@MartinBonner申し訳ありませんが理解できませんでした。もう少し説明できますか?私が知っていたことは、コンパイルする前に、プリプロセッサがソースファイル内のすべてのヘッダをコピーし、次にこのファイルをコンパイルするということでした。これは、中間のソースファイルがコンパイルされているためにサイズが大きくなると言った理由です。しかし、私は、この中間ソースファイルの未使用の機能がすべてアセンブリに含まれているのか、それに続くオブジェクトコードに含まれているのかどうかはわかりません。 – Shubham

+0

"ファイルサイズが増えます" - これは、 "出力ファイルのサイズが、ヘッダーファイルを含めると大きくない場合よりも大きくなります"という意味です。私はこれが本当だとは思わない。 「出力ファイルのサイズが、インクルードされたファイルのために入力ファイルのサイズよりも大きくなる」ということを意味する場合、私はそれも真実ではないと思います。入力ファイルと出力ファイルのサイズは非常に弱い相関しかありません。 –

0

いいえ、それはプログラムのサイズを増加させません。ファイルiostreamおよび他の多くのヘッダーファイルには、コンパイル可能なステートメントはありません。それらには、プログラムに必要な定義がいくつか含まれています。 前処理されたC/C++ファイルを見ると、ファイルの先頭に何千もの定義が追加されています。

あなたは、CPPのツールでそれを試してみてくださいだけで、通常のG ++/gccのようなコマンドでそれを実行し、出力を見ることができます。

ヘッダーと定義のみが含まれているため、最終的なプログラムサイズは増えません。

編集: マーティンが言ったように、彼らはそれぞれの時間をコンパイルしますコンパイルインライン関数を持っていますが、あなたがそれらを使用しない限り、彼らはあなたのプログラムのサイズを増加させません。

+1

'iostream'は確かに* compilableステートメントを持っています!定義(特にインライン関数とテンプレートの*)は*コンパイル可能であり、使用する場合はプログラムのサイズが大きくなります。 –

+0

あなたは正しいです、私はそれらを乱した。 –

0

私は、#include <ファイル>がコンパイルされる前に、C++プリプロセッサによって、われわれの情報源 ファイルに貼り付け、「ファイル」をコピーすることをお読みください。

それはもう少し微妙なそれよりもです。 #include "file"あなたが何を説明していますか? #include <file>ヘッダーを取得しますが、これはファイルである必要はありません。この考え方は、コンパイラーが既にバイナリー形式のヘッダーの独自の内部バージョンを持つことができるため、ファイルを読み込んで解析する必要がないということです。その名前のヘッダーがない場合、インクルード・ディレクティブが#include "file"であるかのように扱い、読み取るファイルを探します。

実際には、私は、この余裕を利用していますコンパイラのか分かりません。すべてのヘッダーは、実際には何度も繰り返しコンパイルされるファイルです。しかし、他の人が言っているように、それ自体が実行可能ファイルが大きくなることを意味するものではありません。理想的には、使用しないと、実行可能ファイルには入りませんが、他のシステムよりも優れているシステムもあります。

+0

私は、標準のライブラリヘッダーのデータベースを持っていたIBMコンパイラがあると思いましたか?それはCコンパイラかもしれません。 –

+0

@MartinBonner - そうです、それについて忘れてしまいました。しかし、それはあまりうまくいきませんでした。それはもうこれ以上のことではありません。 –

関連する問題