2013亚马逊面试题--虚继承的内存模型分析

发表于:2013-1-18 09:36

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wangqiulin123456    来源:51Testing软件测试网采编

分享:

  从vs2010的内存来看的确也是分配了,通过前面的vbtable的偏移来看对象的大小就是16bytes(a是class A的首地址,b是classB的首地址)。有人会问为什么不是20bytes?上面的内存分配偏移是16就说明有20bytes。偏移16,刚好在变量b的下面分配4bytes的C(这说的不准确,不过好明白)这样偏移是16的地方就是D,vbtable现在可以正常定位,Class D为空,就没有必要再分配4bytes的空间,所以sizeof E的大小应该是:vbtable指针(4bytes) +固定局部(a,b工8bytes)+ C 的4bytes(这有点不好明白,不过下面我还有例子,加深理解)。

  代码三:

class A
{
};
class B
{
    int b;
};

class C
{
};
class D
{
};
class E: public virtual A , public virtual B , public virtual C , public virtual D
{
};
void main()
{
   cout<<"sizeof A: "<<sizeof(A)<<endl;
   cout<<"sizeof B: "<<sizeof(B)<<endl;
   cout<<"sizeof C: "<<sizeof(C)<<endl;
   cout<<"sizeof D: "<<sizeof(D)<<endl;
   cout<<"sizeof E: "<<sizeof(E)<<endl; &nbsp; &nbsp; &nbsp;//&nbsp;
}

  上面代码二输出的结果:

  这回感觉还是很奇怪吧,看看内存布局吧。

  首先,看看vbtable把,是不是很奇怪,为什么A,B的偏移都是4,ClassA本身就是空,刚好ClassB有一个成员所以肯定需要给classB分配内存的,所以这样就可以找到A的偏移,Class C和Class D就没办法了没办法计算偏移,所以就给ClassC分配了内存,ClassC有了内存这样D就可以的偏移也就出来了,这时候就有人问为什么ClassD的偏移为什么不是8呢(说实话我也没搞懂,我的猜想是对象本身为空,但是为了内存对齐所以就是4bytes。希望懂的大神给以指点,我通过调试多个例子,得出来的,下面的例子就就更好的说明了这点),

54/5<12345>
价值129的会员专享直播免费赠送,添加微信领取听课名额哦~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号