您的位置:首页 > 编程语言 > C语言/C++

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

2009-02-24 09:07 218 查看
1. 关于整个书,我觉得如果能够把各种类的sizeof搞定,就肯定OK了。所以请参看另一篇文章"sizeof大全":
http://blog.csdn.net/sandyzhs/archive/2008/12/31/3662902.aspx

2. 对象在内存中的布局(不考虑padding,太复杂;只使用int,并假设sizeof(int) == 4byte;IDE是VC6.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;};
这个比较变态,注意:相对于B1和B2来说,A只是普通基类。A在D中根本就没有被共享
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()};
(注意:D的vptr肯定是和其基类共享了,但B、C的vptr还在)
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++对象模型》学习笔记 系列全部结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: