1.
關於整個書,我覺得如果能夠把各種類的
sizeof
搞定,就肯定
ok了。所以請參看另一篇文章"
sizeof
大全":
物件在記憶體中的布局(不考慮
padding
,太複雜;只使用
int,並假設
sizeof(int) == 4byte
;ide
是vc6.0
)。類
記憶體
類
記憶體
1)
class a;
class b;
class c: public a, public b; x
a zb n
c 2)
class a;
class b;
class d: a, b;
vptr a
xvptr b
y zc
3)
class a;
class b;
class d: a, b;
vptr a
x yb z
c 4)
class a;
class b1: a;
class b2: a;
class c1: virtual b1;
class c2: virtual b2;
class d: c1, c2;
這個比較**,注意:相對於b1和
b2來說,
a只是普通基類。a在
d中根本就沒有被共享
offset ** c1
c1offset ** c2
c2 d
d aa b1
b1 a
a b2
b2
5)
class a;
class b: virtual a;
class c: virtual a;
class d: b, c;
(右面**:可能是
offset to a
,也可能是
b中自帶的
vptr
。書上說是前者;根據分析應該是這樣
)offset ** b
z1offset ** c
z2 d
dvptr a
x 6)
class a;
class b:virtual a;
class c:virtual a;
class d: b, c;
(注意:d的
vptr
肯定是和其基類共享了,但b、
c的vptr還在)
offset ** b
vptr z1
offset ** c
vptr z2
d dvptr a
x 7)
class x;
class y1: virtual x;
class y2: virtual x;
class z1: y1;
class z2: y2;
class w: z1, z2;
offset ** y1
y1 z1
z1offset ** y2
y2 z2
z2 w
w xx
至此,《深度探索c++物件模型》學習筆記 系列全部結束。
《深度探索c 物件模型》學習筆記
封裝並未給c 帶來任何的空間或執行期的不良後果,c 在布局和訪問時間上的主要額外負擔由虛擬化引起。包括 1 virtual function機制。用以支援乙個有效率的 執行期繫結 2 virtual base class機制。用以實現 多次出現在繼承體系中的base class,有乙個的單一而被共享...
《深度探索C 物件模型》學習筆記
1.轉型其實是一種編譯器指令,大部分情況下它並不改變乙個指標所含的真正位址,它只影響 被指出之記憶體的大小和內容 的解釋方式.2.global objects的記憶體保證會在程式啟動的時候被清為0,local objects配置於程式的堆疊中,heap objects配置於自由空間中,都不一定會被清...
深度探索c 物件模型學習筆記之物件
在c 中,有兩種資料成員 靜態的和非靜態的,以及三種類成員函式 靜態的 非靜態的和虛函式。已知如下class point宣告 class point 考慮乙個問題,class point在機器中是怎麼表現的呢?簡單物件模型 簡單物件模型,是為了降低c 編譯器的設計複雜度,賠上了空間和執行器的效率而開...