クラスの大きさ——sizeofの研究(3.虚継承)

2487 ワード

このコードを見て
 
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部分+それぞれがベースクラスを指すポインタ+ベースクラスサイズであるべきである(ダミー継承によりベースクラスインスタンスが1つしかない).
                                        Top
                                    /     /
                                   /       /
                                Left       Right
                                /        /
                                  /      /
                                     Bottom
次に、ベースクラス8バイト+Left 4バイト+Right 4バイト+4バイトがベースクラスのポインタ*2+Bottom 4バイト=28バイトを指すと計算する.
 
関数および変数がsizeofインスタンスに統計されているかどうかについては、前の2編を参照してください.
 
純粋に自分で資料に基づいて導き、指摘を歓迎します.