クラスの大きさ——sizeofの研究(3.虚継承)
このコードを見て
結果は次のとおりです.
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編を参照してください.
純粋に自分で資料に基づいて導き、指摘を歓迎します.
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編を参照してください.
純粋に自分で資料に基づいて導き、指摘を歓迎します.