一次近似では、オブジェクトのサイズは、その構成データ メンバーのサイズの合計です。これよりも小さくなることはありません。
より正確には、コンパイラには、データ メンバー間にパディング スペースを挿入して、各データ メンバーがプラットフォームのアライメント要件を満たすようにする権利があります。一部のプラットフォームはアラインメントに関して非常に厳密ですが、他のプラットフォーム (x86) はより寛容ですが、適切なアラインメントによりパフォーマンスが大幅に向上します。そのため、コンパイラの最適化設定でさえ、オブジェクトのサイズに影響を与える可能性があります。
継承と仮想関数により、さらに複雑になります。他の人が言ったように、クラス自体のメンバー関数は「オブジェクトごと」のスペースを占有しませんが、そのクラスのインターフェイスに仮想関数が存在することは、一般に、仮想テーブル、本質的に使用される関数ポインターのルックアップテーブルの存在を意味します実行時に呼び出す適切な関数実装を動的に解決します。仮想テーブル (vtbl) は、通常、各オブジェクトに格納されたポインターを介してアクセスされます。
派生クラス オブジェクトには、基本クラスのすべてのデータ メンバーも含まれます。
最後に、アクセス指定子 (public、private、protected) は、コンパイラにデータ メンバーのパッキングに関する一定の余裕を与えます。
簡単に言うと、 sizeof(myObj) または sizeof(MyClass) は常にオブジェクトの適切なサイズを教えてくれますが、その結果は常に簡単に予測できるとは限りません。