前面代码是*#*#数字#*#*谁能教我! 中间的数字是什么!
1、VS2012使用命令行选项查看对象的内存布局
微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout使用方法很简单,直接在[工具(T)]选项下找到“Visual Studio命令提示(C)”后点击即可切换到cpp攵件所在目录下输入如下的命令即可
2、查看普通多继承子类的内存布局
既然我们今天讲的是虚基类和虚继承,我们就先用上面介绍的命令提示工具查看一下普通多继承子类的内存布局可以跟后文虚继承子类的内存布局情况加以比较。
上面是一个简单的多继承例子我们启動Visual Studio命令提示功能,切换到NormalInheritance.cpp文件所在目录输入一下命令:
我们可以看到class D的内存布局如下:
从类D的内存布局可以看到A派生出B和C,B和C中分别包含A的成员再由B和C派生出D,此时D包含了B和C的成员这样D中就总共出现了2个A成员。大家注意到左边的几个数字这几个数字表明了D中各成员茬D中排列的起始地址,D中的五个成员变量(B::dataA、dataB、C::dataA、dataC、dataD)各占用4个字节sizeof(D) = 20。
为了跟后文加以比较我们再来看看B和C的内存布局:
上面我们看箌了普通多继承子类的内存分布情况,下面我们进入主题来看看典型的菱形虚继承子类的内存分布情况。
我们可以看到菱形继承体系Φ的子类在内存布局上和普通多继承体系中的子类类有很大的不一样。对于类B和Csizeof的值变成了12,除了包含类A的成员变量dataA外还多了一个指针vbptr类D除了继承B、C各自的成员变量dataB、dataA和自己的成员变量外,还有两个分别属于B、C的指针
那么类D对象的内存布局就变成如下的样子:
vbptr:继承洎父类B中的指针
int dataB:继承自父类B的成员变量
vbptr:继承自父类C的指针
int dataC:继承自父类C的成员变量
int A:继承自父类A的成员变量
显然,虚继承之所以能够實现在多重派生子类中只保存一份共有基类的拷贝关键在于vbptr指针。那vbptr到底指的是什么又是如何实现虚继承的呢?其实上面的类D内存布局图中已经给出答案:
table)虚表中记录了vbptr与本类的偏移地址;第二项是vbptr到共有基类元素之间的偏移量。在这个例子中类B中的vbptr指向了虚表D::$vbtable@B@,虚表表明公共基类A的成员变量dataA距离类B开始处的位移为20这样就找到了成员变量dataA,而虚继承也不用像普通多继承那样维持着公共基类的两份同样的拷贝节省了存储空间。
为了进一步确定上面的想法是否正确我们可以写一个简单的程序加以验证:
你对这个回答的评价是
你对这个回答的评价是?
手机内存拓展可以到手机店也可以清理。具体的方法步骤可以参考:
1手机上都会有一个系统自带的文件管理,可以打开里面找出文件然后清理;
2先在腾讯手机管家的垃圾清理清理垃圾,然后点击右上角的手机瘦身进行手机文件深度清理
你对这个回答的评价是?
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。