Visual studio中虚拟继承内存布局

最近两天研究虚拟继承概念,测试了VS2010上面的内存布局。发现对于vs编译器,虚拟继承的虚基类放在了对象的尾部。

先定义了一个继承体系(下面的继承上面的,BC虚继承A)

     A

B     C

    D

    E

每个类里面定义了一个int型变量,并在构造函数的初始化列表初始化为不同值。

内存里面的布局如下,分别定义了一个D和E

0x0025F80A cc cc 88 a9 a8 00 01 00 00 00 74 a9 a8 00 02 00 00 00 03  
0x0025F81D 00 00 00 04 00 00 00 00 00 00 00 cc cc cc cc cc cc cc cc  
0x0025F830 04 a9 a8 00 01 00 00 00 f8 a8 a8 00 02 00 00 00 03 00 00  
0x0025F843 00 00 00 00 00 cc cc cc cc 9c f8 25 00 2f 59 a8 00 01 00  
0x0025F856 00 00 78 49 39 00 18 1e 39 00 fc 41 64 66 00 00 00 00 00 


A:0x0025F844:sizeof:4
B:0x0025F830:sizeof:12
C:0x0025F838:sizeof:12
D:0x0025F830:sizeof:24


A:0x0025F824:sizeof:4
B:0x0025F80C:sizeof:12
C:0x0025F814:sizeof:12
D:0x0025F80C:sizeof:24
E:0x0025F80C:sizeof:28

可见BD或者BDE的起始地址是一样的,而C的地址往后移了8个字节,而A是放在了对象的尾部。从对象中的int值也可以看出来。


对于vs2010得出的结论为:

1. 每个虚拟继承的类都有一个虚拟表指针位于该对象的头部;

2. 每一个virtual关键字对应一个虚拟表指针;

3. 虚拟继承在内存中的顺序按照,继承的顺序排列(比如BC,就是B在前,C在后);

4. 虚基类的成员数据在对象的尾部。


另外的推论:应当是有几个virual class 就会有几个虚拟表指针。但是vs里面的虚拟表指针怎么寻址的,目前还不太清楚。



另外,打开vs memory窗口:

按F5键进入调试状态,执行View→Debug Windows→Memory命令打开Memory窗口进行查看。查看程序中的变量的地址下的内存内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值