1.为什么Derived4类的大小显示8个字节?
class Empty
{};
class Derived4 : virtual public Empty
{
char c;
};
2. Derived2类的大小显示4字节??
class Empty
{};
class Derived2 : virtual public Empty
{};
答案 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(空基类优化),基类“开销”被删除。