《深度探索c++对象模型》学习笔记 - 附录

 

1.         关于整个书,我觉得如果能够把各种类的sizeof搞定,就肯定OK了。所以请参看另一篇文章"sizeof大全":

http://blog.csdn.net/sandyzhs/archive/2008/12/31/3662902.aspx

 

2.         对象在内存中的布局(不考虑padding,太复杂;只使用int,并假设sizeof(int) == 4byteIDEVC6.0)。

内存

内存

 

1)       class A{int x; };

class B{int z;};

class C: public A, public B{ int n;};

x

A

z

B

n

C

 

2)       class A{ int x;virtual void f1()};

class B{int y; virtual void f2()};

class D: A, B{int z; virtual void f3()};

vptr

A

x

vptr

B

y

z

C

 

 

3)       class A{ int x;virtual void f1()};

class B{int y;};

class D: A, B{int z; virtual void f3()};

vptr

A

x

y

B

z

C

 

 

4)       class A{int a;};

class B1: A{int b1;};

class B2: A{int b2;};

class C1: virtual B1{int c1;};

class C2: virtual B2{int c2;};

class D: C1, C2{int d;};

这个比较变态,注意:相对于B1B2来说,A只是普通基类。AD中根本就没有被共享

Offset **

C1

c1

Offset **

C2

c2

d

D

a

A

b1

B1

a

A

b2

B2

 

 

5)       class A{int x;virtual void f()};

class B: virtual A{int z1;};

class C: virtual A{int z2;};

class D: B, C{int d;};

(右面**:可能是offset to A,也可能是B中自带的vptr。书上说是前者;根据分析应该是这样)  

Offset **

B

z1

Offset **

C

z2

d

D

vptr

A

x

 

 

6)       class A{int x; virtual f1()};

class B:virtual A{int z1; virtual f2()};

class C:virtual A{int z2; virtual f3()};

class D: B, C{int d; virtual f4()};

(注意:Dvptr肯定是和其基类共享了,但BCvptr还在)

Offset **

B

Vptr

z1

Offset **

C

vptr

z2

d

D

vptr

A

x

 

7)       class X{int x;};

class Y1: virtual X{int y1;};

class Y2: virtual X{int y2;};

class Z1: Y1{int z1;};

class Z2: Y2{int z2;};

class W: Z1, Z2{int w;};

Offset **

Y1

y1

 

z1

Z1

Offset **

Y2

y2

z2

Z2

w

w

x

X

 

 

 

 

至此,《深度探索c++对象模型》学习笔记 系列全部结束。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值