C++ 虚继承与普通继承的内存模型对比

class X
{
public:
    int i;
    virtualvoid xx(){}
};
vptr
data
Int i

 

  

class A : publicvirtual X  
{
public:
    int j;
    virtualvoid aa(){}
};
vptrA
dataA
Int j;
vptrX
dataX
Int i;
 
 

class AA : public XX 
{
public:
    int j;
    virtualvoid aa(){}
};
vptrXX
dataXX
Int i;
dataAA
Int j;

  

class C : publicvirtual A, publicvirtual B
{
public:
    int k;
    virtualvoid cc(){}
};
vptrC
dataC
Int k;
vptrA
dataA
Int j;
vptrX
dataX
Int i;
vptrB
dataB
double d;

  

class CC : public AA, public BB
{
public:
    int k;
    virtualvoid cc(){}
};
vptrXX
dataXX
Int i;
dataAA
Int j;
vptrXX
dataXX
Int i;
dataBB
double d;

 

#include <iostream.h>
//本程序用来测试虚继承的构造函数的默认设置
class X
{
public:
 int i;
 virtual void xx(){}
};
class A : public virtual X  
{
public:
 int j;
 virtual void aa(){}
};
class B : public virtual X  
{
public:
 double d;
 virtual void bb(){}
};
class C : public virtual A, public virtual B
{
public:
 int k;
 virtual void cc(){}
};

 

class XX
{
public:
 int i;
 virtual void xx(){}
};
class AA : public  XX 
{
public:
 int j;
 virtual void aa(){}
};
class BB : public  XX  
{
public:
 double d;
 virtual void bb(){}
};
class CC : public  AA, public  BB
{
public:
 int k;
 virtual void cc(){}
};
//  cannot resolve location of pa->X::i at compile-time
// void foo( const A* pa ) { pa->i = 1024; }

// possible compiler transformation
void foo( const X* pa )
{
 //pa->i = 1024;
 cout << pa->i<<endl;
}
int main()
{
 X x;
 XX xx; 
 cout <<sizeof x << "/t"<<&x<<endl;
 cout <<sizeof xx << "/t"<<&xx<<endl;
 //foo(&x);
 A a;
 AA aa;
 cout <<sizeof a << "/t"<<&a<<endl;
 cout <<sizeof aa << "/t"<<&aa<<endl; 
 //foo(&a);
 B b;
 BB bb;
 cout <<sizeof b << "/t"<<&b<<endl;
 cout <<sizeof bb << "/t"<<&bb<<endl; 
 //foo(&b);
 C c;
 CC cc;
 cout <<sizeof c << "/t"<<&c<<endl;
 cout <<sizeof cc << "/t"<<&cc<<endl; 
 //foo(&c);  
 return 0;
}

 

 

 

 

 

 

 

对象 size  mem address mem context       means

x 8 0x22ff78 D44A4300  00604300      {_vptr$X = 0x434ad4, i = 4415488}
xx 8 0x22ff68 444B4300  00000000      {_vptr$XX = 0x434b44, i = 0}
a 16 0x22ff58 384A4300  05EFBE77  484A4300  38104000    {<X> = {_vptr$X = 0x434a48, i = 4198456}, _vptr$A = 0x434a38, j = 2009001733}
aa 12 0x22ff48 E44A4300  00E0FD7F  38000000     {<XX> = {_vptr$XX = 0x434ae4, i = 2147344384}, j = 56}      
b 24 0x22ff28 584A4300  E3C2BF77  14B8C077  503D3D00  684A4300  08000000 {<X> = {_vptr$X = 0x434a68, i = 8}, _vptr$B = 0x434a58, d = 1.6265016828463365e-307}
bb 16 0x22ff18 F44A4300  E0FF2200  945CC077  7020BE77    {<XX> = {_vptr$XX = 0x434af4, i = 2293728}, d = 6.2171013157774407e+268}
c 40 0x22fee8         {<A> = {<X> = {_vptr$X = 0x434aa4, i = 4013313}, _vptr$A = 0x434a94, j = 2009055971}, <B> = {_vptr$B = 0x434ab8, d = -nan(0xfffff77be2088)}, _vptr$C = 0x434a80, k = 3997696}
cc 40 0x22feb8         {<AA> = {<XX> = {_vptr$XX = 0x434b04, i = 2090010352}, j = 2293504}, <BB> = {<XX> = {_vptr$XX = 0x434b18, i = 2293288}, d = 5.2835848490785469e-308}, k = 2090003992}
            804A4300  00003D00  944A4300  E3C2BF77  A44A4300  013D3D00  B84A4300  945CC077  8820BE77  FFFFFFFF
            044B4300  F006937C  00FF2200  18EE0100  184B4300  28FE2200  EB06937C  1CFF2200  18EE927C  7005937C

0x22ff78 : 0x22FF78 <Hex>
  Address   0 - 3     4 - 7     8 - B     C - F                       
  0022FEB0  00000000  00000000  044B4300  F006937C         
  0022FEC0  00FF2200  18EE0100  184B4300  28FE2200         
  0022FED0  EB06937C  1CFF2200  18EE927C  7005937C         
  0022FEE0  FFFFFFFF  6D05937C  804A4300  00003D00         
  0022FEF0  944A4300  E3C2BF77  A44A4300  013D3D00         
  0022FF00  B84A4300  945CC077  8820BE77  FFFFFFFF         
  0022FF10  CEC3BF77  F8FE2200  F44A4300  E0FF2200         
  0022FF20  945CC077  7020BE77  584A4300  E3C2BF77         
  0022FF30  14B8C077  503D3D00  684A4300  08000000         
  0022FF40  ADAEC077  68203400  E44A4300  00E0FD7F         
  0022FF50  38000000  02000000  384A4300  05EFBE77         
  0022FF60  484A4300  38104000  444B4300  00000000         
  0022FF70  90FF2200  521D4100  D44A4300  00604300         
  0022FF80  00004000  AB104000  802B3D00  00000000         
  0022FF90  B0FF2200  2D124000  01000000  703D3D00         
  0022FFA0  802B3D00  06000000  083DEDBA  00E0FD7F         
  0022FFB0  C0FF2200  58124000  01000000  09000000         
  0022FFC0  F0FF2200  D76F817C  68203400  00000000         
  0022FFD0  00E0FD7F  EDB65480  C8FF2200  58B6D985         
  0022FFE0  FFFFFFFF  A89A837C  E06F817C  00000000         
  0022FFF0  00000000  00000000  40124000  00000000         

 

0x434b04 <Hex>
  Address   0 - 3     4 - 7     8 - B     C - F              
  004349F0  1C4F4300  00000000  00000000  00000000         
  00434A00  00000000  00000000  00000000  604F4300         
  00434A10  1C434300  30434300  744F4300  A04F4300         
  00434A20  5C434300  70434300  B44F4300  08000000         
  00434A30  00000000  90434300  205E4100  00000000         
  00434A40  F8FFFFFF  90434300  7C5F4100  10000000         
  00434A50  00000000  B0434300  845E4100  00000000         
  00434A60  F0FFFFFF  B0434300  7C5F4100  18000000         
  00434A70  10000000  08000000  00000000  D0434300         
  00434A80  E85E4100  00000000  08000000  F8FFFFFF         
  00434A90  D0434300  205E4100  00000000  F0FFFFFF         
  00434AA0  D0434300  7C5F4100  00000000  F8FFFFFF         
  00434AB0  E8FFFFFF  D0434300  845E4100  00000000         
  00434AC0  00000000  00000000  00000000  00000000         
  00434AD0  10444300  7C5F4100  00000000  00000000         
  00434AE0  18444300  7C604100  A45F4100  00000000         
  00434AF0  24444300  7C604100  EC5F4100  00000000         
  00434B00  30444300  7C604100  A45F4100  34604100         
  00434B10  F0FFFFFF  30444300  7C604100  EC5F4100         
  00434B20  00000000  00000000  00000000  00000000         
  00434B30  00000000  00000000  00000000  00000000         
  00434B40  70444300  7C604100  00000000  00000000         
  00434B50  78444300  48154000  74154000  00000000         
  00434B60  80444300  002A4000  202A4000  90294000         
  00434B70  A0294000  302B4000  802B4000  70324000         
  00434B80  202D4000  E02B4000  00000000  00000000         
  00434B90  00000000  00000000  00000000  00000000         
  00434BA0  8C444300  702A4000  902A4000  90294000         
  00434BB0  A0294000  302B4000  802B4000  C0324000         
  00434BC0  802D4000  002C4000  00000000  00000000         
 

 

 

 

 

 

阅读更多
上一篇C++ 对象模型
下一篇通用 求解 数据结构 size 函数
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭