在下面的代码中,我不明白为什么'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发布于 2018-07-17 20:10:40
class的sizeof必须为1或更大,否则指针算法将严重崩溃,并且该class的数组元素将全部占用相同的内存。
因此,与sizeof(Empty)一样,sizeof(Derived1)至少为1。空基优化意味着派生类的大小实际上是零。
由于单个成员是char,因此sizeof(Derived3)也可以是1。请注意,编译器在这里再次利用了空基优化。
多态类(即那些包含virtual关键字的类)具有更大的大小,这是因为您的编译器实现了多态行为的要求。
发布于 2018-07-17 20:14:56
在下面的代码中,我不明白为什么'Derived1‘需要和’
‘一样多的内存。
与所有其他对象不同,允许空的基本子对象与其同级对象共享其地址。因此,空库不需要占用任何内存。
除了的空基外,Derived3只包含一个char对象。char的大小是1,因此Derived3适合1的大小。
除了空的基外,Derived1什么也不包含。但由于所有对象(不包括涉及子对象的例外)都必须有唯一的地址,所以任何类型的最小大小都是1,因此Derived1的大小是1。
派生4的大小是否也有任何特定的意义为16。
没有任何意义。其大小是相当典型的。
https://stackoverflow.com/questions/51380901
复制相似问题