我不明白为什么“ Derived1”需要与“ Derived3”相同的内存量

时间:2018-07-17 12:02:59

标签: c++ oop

在以下代码中,我不明白为什么“ Derived1”需要与“ Derived3”相同的内存量。还有派生4的大小为16的任何特定意义。

#include <iostream>
using namespace std;

class Empty
{};

class Derived1 : public Empty
{};

class Derived2 : virtual public Empty
{};

class Derived3 : public Empty
{    
    char c;
};

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

class Dummy
{
    char c;
};

int main()
{
    cout << "sizeof(Empty) " << sizeof(Empty) << endl;
    cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;
    cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;
    cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;
    cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;    
    cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;

    return 0;
}

此代码的输出为:

sizeof(Empty) 1
sizeof(Derived1) 1
sizeof(Derived2) 8
sizeof(Derived3) 1
sizeof(Derived4) 16
sizeof(Dummy) 1

2 个答案:

答案 0 :(得分:8)

class的{​​{1}}必须等于1或更大,否则指针算法将严重中断,并且该sizeof的数组元素将全部占用相同的内存。

因此class至少为1,sizeof(Derived1)也是如此。 空基优化表示派生类的大小实际上为零。

sizeof(Empty)也可以是1,因为单个成员是sizeof(Derived3)。请注意,编译器再次在此处利用空基础优化

多态类(即包含char关键字的类)的大小较大,这是因为您的编译器实现了多态行为的要求。

答案 1 :(得分:2)

  

在下面的代码中,我不明白为什么'Derived1'需要与'Derived3'相同的内存量。

与所有其他对象不同,允许空的基础子对象与其兄弟对象共享地址。因此,空基不需要占用任何内存。

除了 empty 基础之外,Derived3仅包含char对象。 char的大小为1,因此Derived3的大小为1。

基外,Derived1不包含任何内容。但是因为所有对象(不包括涉及子对象的异常)必须具有唯一的地址,所以任何类型的最小大小为1。因此,Derived1的大小为1。

  

派生4的大小为16也有任何特定的意义。

没有任何意义。大小很典型。