空类的大小&派生虚拟课程

时间:2013-08-10 17:46:36

标签: c++ class oop sizeof

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

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

2. Derived2类的大小显示4字节??

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

3 个答案:

答案 0 :(得分:5)

请注意sizeof(any_class)是实现定义的。

但在你的情况下实际发生了什么。好吧,它正在使用virtual继承,大多数实现都使用隐藏指针来实现此功能,这需要花费sizeof(pointer)个字节(指针存储在派生类本身中), plus 所有成员的大小(如果有的话)加上填充,如果有必要加上 sizeof基类(es)(在空基类的情况下,由于空基优化,可以减少到零。

有关更详细的答案,请在此站点上搜索“C ++中的填充”。你会发现很多主题。

答案 1 :(得分:2)

  

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

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

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

您将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中继承Derived4作为在__vptr类中插入的虚拟结果Derived4变量。因此,Dervied4的大小为sizeof(void*);这只不过是32位机器中4字节的大小。

答案 2 :(得分:2)

我想添加Saravanan语句,确实空类的大小不是0字节但是当用作基类时,由于EBCO(空基类优化),基类“开销”被删除。