C 物件模型學習筆記3 Data語意學

2021-08-30 06:47:38 字數 2502 閱讀 6957

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 視編譯器不同而不同...