3

1.Derived4 クラスのサイズが 8 バイトを示しているのはなぜですか??

class Empty
{};
class Derived4 : virtual public Empty
{
    char c;
};

2.Derived2 クラスのサイズは 4 バイトですが??

class Empty
{};
class Derived2 : virtual public Empty
{};
4

3 に答える 3

5

sizeof(any_class)実装定義であることに注意してください。

しかし、実際にあなたの場合に何が起こるか。まあ、それはvirtual継承を使用しています。ほとんどの実装では、この機能を実装するために隠しポインターを使用します。これsizeof(pointer)は、バイト (ポインターは派生クラス自体に格納されます) に加えて、すべてのメンバーのサイズ(存在する場合)必要に応じてパディング、およびベースのサイズ消費します。クラス (空の基本クラスの場合、空の基本最適化によりゼロに削減される可能性があります)。

より詳細な回答については、このサイトで「C++ のパディング」を検索してください。あなたはそれに多くのトピックを見つけるでしょう。

于 2013-08-10T17:49:49.417 に答える
2

空のクラスは 0 バイト以外のサイズですが、基本クラスとして使用すると、EBCO (Empty Base Class Optimization) のおかげで基本クラスの「オーバーヘッド」が削除されるという Saravanan ステートメントに追加します。

于 2013-08-12T08:23:50.070 に答える
2

Derived4クラス のサイズが 8 バイトを示しているのはなぜですか?

class Empty
{};
class Derived4 : virtual public Empty
{
    char c;
};

32 ビット マシンでは、g++ は空のクラスに対して 1 バイトを生成します (メモリ内のクラス名を表すため)。これは意図した動作です。

asを継承Emptyすると、コンパイラによってデフォルトでクラスに変数が作成されます。したがって、クラスは次のようになります。Derived4virtual public__vptrDerived4Derived4

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__vptrDerived4Dervied4sizeof(void*)

于 2013-08-12T07:45:59.740 に答える