14

2 つのパブリック関数 (コンストラクターとデストラクター) のみを持つクラス X を作成しましたsizeof。演算子を使用すると、クラス サイズは 1 になります。

型のプライベート データ メンバーをchar上記のクラス宣言に追加すると、サイズは 1 のままです。最後に、整数型をクラス データ メンバーとして追加すると、サイズは 8 バイトになります。

クラスサイズの計算方法を教えてください。

4

2 に答える 2

24

まず、仮想ではない関数はクラスのサイズに影響を与えないことを理解してください。

クラスが空の場合でも、クラスのインスタンスのサイズは少なくとも 1 バイトであるため、オブジェクトが異なればアドレスも異なります。

を追加するcharと、異なるオブジェクトが異なるアドレスを持つことが保証されるため、コンパイラは人為的にサイズに 1 を追加しません。サイズはsizeof(char)= 1 です。

次に、を追加しintます。これにより、(おそらく) プラットフォームに 4 バイトが追加されます。次に、コンパイラは、パフォーマンス/CPU 要件の理由で整列されるようにクラスをパディングすることを決定し、3 つの空のバイトを追加して、サイズが 1 + 3 + 4 = 8 になるようにします。おそらく、intメンバーの前にパディングを追加して、これは 4 バイト境界で整列されますが、CPU が必要としない限り、必要ありません。

ウィキペディアのページでパディングについて読むことができます。

于 2013-02-22T20:59:11.793 に答える
8

C++ のクラスのオブジェクトのサイズを決定する要因は多数あります。これらの要因は次のとおりです。

  1. すべての非静的データ メンバーのサイズ
  2. データ メンバーの順序
  3. バイト アラインメントまたはバイト パディング
  4. 直接の基本クラスのサイズ
  5. 仮想関数の存在 (仮想関数を使用した動的ポリモーフィズム)。
  6. 使用しているコンパイラ
  7. 継承のモード (仮想継承)

ここで詳細を見つけることができますhttp://www.cprogramming.com/tutorial/size_of_class_object.html

于 2013-02-22T21:02:48.160 に答える