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

我会在 Saravanan 声明中补充说,空类的大小是非 0 字节,但是当用作基类时,由于 EBCO(空基类优化),基类的“开销”被删除了。

于 2013-08-12T08:23:50.070 回答
2

为什么Derived4类显示的大小是 8 个字节?

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

在 32 位机器下,g++ 为一个空类生成 1 个字节(以便在内存中表示类名)。这是一种预期的行为。

您继承EmptyDerived4结果是编译器默认在类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虚拟Derived4结果变量继承。所以,大小为; 在 32 位机器中,这不过是 4 个字节的大小。__vptrDerived4Dervied4sizeof(void*)

于 2013-08-12T07:45:59.740 回答