在以下代码中,我不明白为什么“ 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
答案 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也有任何特定的意义。
没有任何意义。大小很典型。