1.Derived4 クラスのサイズが 8 バイトを示しているのはなぜですか??
class Empty
{};
class Derived4 : virtual public Empty
{
char c;
};
2.Derived2 クラスのサイズは 4 バイトですが??
class Empty
{};
class Derived2 : virtual public Empty
{};
sizeof(any_class)
実装定義であることに注意してください。
しかし、実際にあなたの場合に何が起こるか。まあ、それはvirtual
継承を使用しています。ほとんどの実装では、この機能を実装するために隠しポインターを使用します。これsizeof(pointer)
は、バイト (ポインターは派生クラス自体に格納されます) に加えて、すべてのメンバーのサイズ(存在する場合)、 必要に応じてパディング、およびベースのサイズを消費します。クラス (空の基本クラスの場合、空の基本最適化によりゼロに削減される可能性があります)。
より詳細な回答については、このサイトで「C++ のパディング」を検索してください。あなたはそれに多くのトピックを見つけるでしょう。
空のクラスは 0 バイト以外のサイズですが、基本クラスとして使用すると、EBCO (Empty Base Class Optimization) のおかげで基本クラスの「オーバーヘッド」が削除されるという Saravanan ステートメントに追加します。
Derived4
クラス のサイズが 8 バイトを示しているのはなぜですか?class Empty {}; class Derived4 : virtual public Empty { char c; };
32 ビット マシンでは、g++ は空のクラスに対して 1 バイトを生成します (メモリ内のクラス名を表すため)。これは意図した動作です。
asを継承Empty
すると、コンパイラによってデフォルトでクラスに変数が作成されます。したがって、クラスは次のようになります。Derived4
virtual public
__vptr
Derived4
Derived4
class Derived4 {
void* __vptr; // 4 bytes
char c; // 4 bytes as 1 char + 3 for structure padding
};
したがって、上記のクラスのサイズは 8 バイトです。同意していただければ幸いです。
クラスのサイズ
Derived2
は4バイトですが?class Empty {}; class Derived2 : virtual public Empty {};
ここで、同じ原則が空のクラス 1 バイトに適用され、クラスに挿入された仮想結果変数として継承Empty
されます。だから、のサイズは; これは、32 ビット マシンでは 4 バイトのサイズに他なりません。Derived4
__vptr
Derived4
Dervied4
sizeof(void*)