9

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

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

4

3 に答える 3

10

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

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

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

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

C++ 固有の質問: クラス定義自体は、アセンブリでは実際には表示されません。インライン化されていないメンバー関数は、コンパイルする必要がある関数にすぎませんが、データ メンバーはプリミティブ データ メンバーと同じように扱われます。その型のインスタンスを宣言するとコール スタックに置かれますが、直接ではありません。アセンブリコードに影響を与えます...定数で初期化している場合を除きます。もちろん、定数はコードに入ります。

于 2011-09-06T12:02:12.820 に答える
3

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

ほとんどのコンパイラは、デバッグを容易にするためにコンパイル中にデバッグ シンボルを追加するオプションを提供しますが、オブジェクト ファイルのサイズが大きくなります。オプションを使用してデバッグ シンボルを追加し、GCC-gのオプションを使用してそれらを削除できます。-sVisual Studio にも似たようなものがあります。

于 2011-09-06T12:04:47.870 に答える
2

コンパイラに大きく依存しますが、.

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

今すぐコーディングします。メンバー変数を追加するときは、それを構築して破棄する必要があります。これには、コンストラクタとデストラクタが必要になりますが、どちらも自明であるかどうかはわかりません。それらが自明でない場合、コードサイズがわずかに大きくなります。これらのメンバー変数を処理するには、追加のコードが必要になるためです。

于 2011-09-06T12:09:02.893 に答える