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