在以下代码中,我无法理解为什么“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

最佳答案

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

因此sizeof(Derived1)至少为1,sizeof(Empty)也是如此。空基优化意味着派生类的大小实际上为零。
sizeof(Derived3)也可以为1,因为单个成员是char。请注意,编译器在此处再次利用空基优化。

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

关于c++ - 我不明白 'Derived1'为什么需要与 'Derived3'相同的内存量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51380901/

10-11 20:03