2013亚马逊面试题--虚继承的内存模型分析
作者:网络转载 发布时间:[ 2013/1/18 10:46:21 ] 推荐标签:面试
查看Derived这个类的对象在内存中的布局,那么可以用下面的命令行:
cl Test.cpp /d1reportSingleClassLayoutDerived
结果显示如下:
可以看到class Derived的对象的内存布局,在派生类对象的开始包含了基类Base的对象,其中有一个虚表指针,指向的是下面的Derived::$vftable@ (virtual function table),表中包含了Derived类中所有的虚函数。
内存模型
在这一小节里面我主要从他面试的几个题目中来谈谈虚继承的内存模型。
代码一:
class A
{
virtual void a()
{
}
};
class A1
{
virtual void a()
{
}
};
class B : public A , virtual public A1
{
};
void main()
{
cout<<"sizeof A: "<<sizeof(A)<<endl;
cout<<"sizeof A1: "<<sizeof(A1)<<endl;
cout<<"sizeof B: "<<sizeof(B)<<endl; //
}
输出结果是:
在命令行中输入:
cl test.cpp /d1reportSingleClassLayoutB
从这个内存布局可以看出来class A、class A1和ClassB的大小,本身class A的大小应该是1bytes的内存定位大小加上虚函数指针4bytes因为有了虚函数指针后1bytes的占位可以取消了。所以A的大小是4bytes,同理Class A1。对于Class B它主要是从class A和class A1(虚继承)而来,所以B里面包含有一个A和A1同时因为是需继承所以有一个指向虚基类(A1)的vbptr指针。这里为了方便我做个图直观一点:
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11