类的大小——sizeof 的研究(3.虚继承)
2012-10-14 17:21
260 查看
转自:/article/2052904.html
看这段代码
[cpp] view
plaincopy
class Top
{
protected:
int x;
public:
Top(int n):x(n){cout<<"Top"<<endl;}
virtual ~Top(){}
};
class Left:virtual public Top
{
protected:
int y;
public:
Left(int m,int n):Top(m){y=n;cout<<"Left"<<endl;}
};
class Right:public virtual Top
{
protected:
int z;
public:
Right(int m,int n):Top(m){z=n;cout<<"Right"<<endl;}
};
class Bottom:public Left,public Right
{
int w;
public:
Bottom(int i,int j,int k,int m):Top(i),Left(i,j),Right(i,k),w(m)
{
cout<<"Bottom"<<endl;
}
};
int main()
{
Bottom b(1,2,3,4);
cout<<"sizeof(b) "<<sizeof(b)<<","<<sizeof(Bottom)<<endl;
cout<<sizeof(Left)<<","<<sizeof(Right)<<","<<sizeof(Top)<<endl;
for(int i=0;i<sizeof(b);i+=4)
cout<<*(reinterpret_cast<int*>((&b)+i))<<"________"<<endl;
system("PAUSE");
}
结果如下:
Top
Left
Right
Bottom
sizeof(b) 28,28
16,16,8
4657244________
2367460________
0________
746________
44________
5701724________
4________
请按任意键继续. . .
也就是说Top为占8字节,这好理解。
int x; //4字节
virtual ~Top(){} //基类的虚表入口,4字节
接着看Left跟Right都是16字节。
本来除了Top的8字节,Left里只有int y; 占4字节,还有4字节占在那里?
由于是虚继承,虚继承的子类都要包含一个指向基类的指针,从而实现动态联编。
一次,要额外加4字节的空间。所以一共是8+4+4=16字节。
Right同理。
再看Bottom的大小为28字节,这个是怎么算的呢?
虚继承是棱形继承,基类大小为8字节.
而Bottom为普通多继承,因此,Bottom的大小应该是Bottom部分+Left部分+Right部分+各自指向基类的指针+基类大小(虚继承导致只有一个基类实例)。
Top
/ /
/ /
Left Right
/ /
/ /
Bottom
现在算算,基类8字节+Left4字节+Right4字节+4字节指向基类的指针*2+Bottom4字节=28字节。
关于函数以及变量是否统计入sizeof实例,请参考我前两篇。
纯粹自己根据资料推导,欢迎指正。
看这段代码
[cpp] view
plaincopy
class Top
{
protected:
int x;
public:
Top(int n):x(n){cout<<"Top"<<endl;}
virtual ~Top(){}
};
class Left:virtual public Top
{
protected:
int y;
public:
Left(int m,int n):Top(m){y=n;cout<<"Left"<<endl;}
};
class Right:public virtual Top
{
protected:
int z;
public:
Right(int m,int n):Top(m){z=n;cout<<"Right"<<endl;}
};
class Bottom:public Left,public Right
{
int w;
public:
Bottom(int i,int j,int k,int m):Top(i),Left(i,j),Right(i,k),w(m)
{
cout<<"Bottom"<<endl;
}
};
int main()
{
Bottom b(1,2,3,4);
cout<<"sizeof(b) "<<sizeof(b)<<","<<sizeof(Bottom)<<endl;
cout<<sizeof(Left)<<","<<sizeof(Right)<<","<<sizeof(Top)<<endl;
for(int i=0;i<sizeof(b);i+=4)
cout<<*(reinterpret_cast<int*>((&b)+i))<<"________"<<endl;
system("PAUSE");
}
结果如下:
Top
Left
Right
Bottom
sizeof(b) 28,28
16,16,8
4657244________
2367460________
0________
746________
44________
5701724________
4________
请按任意键继续. . .
也就是说Top为占8字节,这好理解。
int x; //4字节
virtual ~Top(){} //基类的虚表入口,4字节
接着看Left跟Right都是16字节。
本来除了Top的8字节,Left里只有int y; 占4字节,还有4字节占在那里?
由于是虚继承,虚继承的子类都要包含一个指向基类的指针,从而实现动态联编。
一次,要额外加4字节的空间。所以一共是8+4+4=16字节。
Right同理。
再看Bottom的大小为28字节,这个是怎么算的呢?
虚继承是棱形继承,基类大小为8字节.
而Bottom为普通多继承,因此,Bottom的大小应该是Bottom部分+Left部分+Right部分+各自指向基类的指针+基类大小(虚继承导致只有一个基类实例)。
Top
/ /
/ /
Left Right
/ /
/ /
Bottom
现在算算,基类8字节+Left4字节+Right4字节+4字节指向基类的指针*2+Bottom4字节=28字节。
关于函数以及变量是否统计入sizeof实例,请参考我前两篇。
纯粹自己根据资料推导,欢迎指正。
相关文章推荐
- 类大小——sizeof 研究(虚继承)
- 类的大小——sizeof 的研究(2.虚函数继承)
- 类的大小——sizeof 的研究(3.虚继承)
- sizeof 和类继承 虚继承 求类大小
- 一道关于继承类的sizeof大小问题
- 类的大小——sizeof 的研究(1)
- 单继承,多继承,虚拟继承,sizeof大小
- 类的大小——sizeof 的研究(1)
- C++虚继承与其他继承类的sizeof()大小详解
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
- 由于被鄙视了,所以研究下sizeof求结构体大小的算法
- 【转】类的大小——sizeof 的研究
- 类的大小——sizeof 的研究
- C++类的大小研究-SIZEOF-虚函数-虚表
- 空类、含静态成员的类、普通类(不含虚函数、虚继承)的sizeof大小
- 类的大小——sizeof 的研究
- 类的大小——sizeof 的研究
- 使用sizeof计算虚拟继承的类对象的空间大小
- 类的大小——sizeof 的研究
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte