2011-09-06 5 views
9

C++ファイルをコンパイルするたびに、objファイルが生成されます。 objファイルのサイズはどのような要因に依存するのかを知りたいのですが?C++オブジェクトファイルのサイズは何に依存していますか?

たとえば、C++ファイルにはクラス宣言が含まれています。このクラスには、データメンバとして1つの整数変数があり、メンバ関数もいくつかあります。このファイルをコンパイルすると、いくつかのobjファイルがいくつかのXサイズで作成されます。今私は、データメンバーとメンバー関数を追加し、objファイルのサイズが変更されると仮定しますか?

+3

"obj"ファイルサイズとオブジェクト(メモリ)サイズのサイズの間に結論を出そうとはしません。あなたが達成しようとしていることは何ですか? –

+0

ここで私はオブジェクトのサイズがそれが持っているデータのメンバーに依存することを知っているので、objファイルのサイズに興味があります。しかし、objファイルのサイズに依存する要因は何ですか?実際に私はインタビューでこれを尋ねられたので、答えを知りたがっていました。 –

答えて

10

これは、100万の異なる要素に依存し、完全にプラットフォームとコンパイラと設定に依存します。

オブジェクトファイルには、外部リンケージ機能を持つ関数本体のすべてのアセンブリと、外部リンケージを持つすべてのグローバル変数が含まれている必要があります。内部リンクを持つものは、最適化され、コールサイトに直接統合されている可能性があるため、オブジェクトファイルに別のエントリが必要な場合があります。これは、最適化設定に大きく依存します。

GCCには、基本的にソースコード全体のコピーをオブジェクトファイルに追加し、そのサイズを大幅に増やす「リンク時の最適化」オプションがあります。

デバッグシンボルも多くの余分なデータを追加します。

あなたのC++固有の質問について:クラス定義自体は実際にアセンブリでは見えません。インラインでないメンバ関数はコンパイルするだけの関数ですが、データメンバはプリミティブデータメンバと同じように扱われますが、その型のインスタンスを宣言するとコールスタック上にありますが、直接はありませんアセンブリコードに影響を与えます...定数で物事を初期化しない限り。もちろん、定数はコードに入ります。

+0

Kerrekありがとうございました。 –

3

オブジェクトファイルには、ソースがコンパイルされた後、リンクされる前のマシンコードが含まれています。したがって、オブジェクトファイルのサイズは基本的にコードの複雑さに依存します。

ほとんどのコンパイラでは、コンパイル時にデバッグシンボルを追加してデバッグを簡単にするオプションがありますが、オブジェクトファイルのサイズは大きくなります。 -gオプションを使用してデバッグシンボルを追加し、GCCの-sオプションを使用してデバッグシンボルを削除することができます。 Visual Studioには似たようなものがあります。

2

非常にコンパイラに依存しますが、

オブジェクトファイルには、実行可能コード、リンケージスタブ、およびメタデータが含まれます。メタデータは、コンパイラに依存するものであれば何でも構いません。そのため、コンパイラが何を考えているかによって、何かが起こる可能性があります。リンケージスタブは、外部リンケージを持つすべてのエンティティと、同じオブジェクトファイルのクラスにメンバーを追加することによって直接影響を受けない、他のオブジェクトファイル内のエンティティへのすべての送信参照用に作成されます。

コードを作成します。メンバ変数を追加するときには、それを構築して破壊する必要があります。それは、どちらも些細なことであろうとなかろうと、コンストラクタとデストラクタを必要とします。それらが些細なことでない場合、これはコードサイズのわずかな増加につながります。なぜなら、これらのメンバー変数を処理するために余分なことが行われなければならず、余分なコードが必要になるからです。

関連する問題