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++ 中的填充” 。你会发现很多关于它的话题。
我会在 Saravanan 声明中补充说,空类的大小是非 0 字节,但是当用作基类时,由于 EBCO(空基类优化),基类的“开销”被删除了。
为什么
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
结果变量继承。所以,大小为; 在 32 位机器中,这不过是 4 个字节的大小。__vptr
Derived4
Dervied4
sizeof(void*)