classx;
classy:
public
virtual x
;classz:
public
virtual x
;classa:
public y,
public z
;
class x, 乙個empty class,占用1 byte,是被編譯器安插進去的乙個char,目的是為了乙個class的兩個objects得以在記憶體中擁有獨一無二的位址,以區分不同的物件。
y和z的大小受到三個因素的影響:
語言本身所造成的額外負擔overhead。語言支援virtual base classes時導致的額外負擔反映在某種形式的指標身上,它要麼指向virtual base class subobject,要麼指向乙個存放virtual base class subobject位址或者其偏移量offset的**。
編譯器對於特殊情況所提供的優化處理。virtual base class x 1 byte大小的subobject也出現在class y和z身上。
alignment的限制。alignment就是將數值調整到某數的整數倍。
乙個virtual base class subobject只會在derived class中存在乙份實體,不管它在class繼承體系中出現了多少次。
c++ standard並不強制規定base class subobjects、不同訪問級別的data members的排列次序這種瑣碎細節,它也不規定virtual function以及virtual base classes的實現細節。
static vs. non-static
data member的繫結
data member的布局
template
<
class
class_type
,class
data_type1
,class
data_type2
>
char
*access_order
(data_type1 class_type::
*mem1,
data_type2 class_type::
*mem2)
access_order
(&point3d::z,
&point3d::y)
;
data member的訪問
繼承與data member多型
多重繼承
classa;
classa1:
public a
;class
bclassab:
public a1, b
ab ab;
a* pa =
&ab; 直接ab
a1* pa1 =
&ab; 直接ab
b* pb =
&ab; 非自然轉換 &ab?
(b*)((
char*)
&ab+
sizeof
(a1)):
0;
虛擬繼承
class內如果內含乙個或多個virtual bass class subobjects,像iostream那樣,將被分割為兩部分:乙個不變區域和乙個共享區域。不變區域的資料,不管後繼怎麼變化,總是擁有固定的offset,可以直接訪問;而共享區域表現的就是virtual base class subobject,這一部分的資料,其位置會因為每次的派生操作而變化,只可間接訪問。各家編譯器實現技術之間的差異就在於間接訪問的方法不同。
一般而言,virtual base class最有效的一種運用方式是:乙個沒有任何data member的抽象class。
指向data members的指標
乙個有點神秘但頗有用處的語言特性,特別是如果你需要詳細調查class members的底層布局。這樣的調查可用來決定vptr是放在class的起始處還是尾端。另乙個用途,還可用來決定class中access sections的次序。
printf
("%p\n"
,&point3d::x)
;// 4
printf
("%p\n"
,&point3d::y)
;// 8
printf
("%p\n"
,&point3d::z)
;// c ⇒ 這裡存的是offset
如果x,y,z是連續的,而且是從0開始的,說明vptr在尾端。否則,vptr在前面。
深度探索c 物件模型(3) data
空基類的大小為1byte,為了讓不同的空型別的位址有區別 一 data member的布局 nonstatic member data按宣告順序存在class object中 static member data位於global data segment 不會影響object大小 對static m...
深度探索C 物件模型學習筆記 Data語意學
例子 class x class y public virtual x class z public virtual x class a public y,public z 物件大小由下述原因決定 1.語言本身所造成的額外負擔 如 支援virtual base classes時,derived cl...
深度探索C 物件模型 Data語意學筆記
class x class y public virtual x class z public virtual x class a public y,public z 它們的sizeof結果如下 sizeof x 1 sizeof y 8 視編譯器不同而不同 sizeof z 8 視編譯器不同而不同...