深度探索c 物件模型(3) data

2021-10-23 14:29:06 字數 1481 閱讀 6783

空基類的大小為1byte,為了讓不同的空型別的位址有區別

一、data member的布局:

nonstatic member data按宣告順序存在class object中

static member data位於global data segment(不會影響object大小)。對static member data取位址,得到的是指向該資料型別的指標。

二、data member的訪問:

對於static data member進行訪問操作,在任何情況下,使用指標和dot是一樣的。對乙個類的member data取位址,得到的是該member data在object中的偏移,而對乙個例項化物件取位址,得到的是指向該資料結構的指標。

對於nonstatic data member進行訪問操作,需要把class object起始位址+offset。如果存在虛繼承的情況,使用指標訪問變數時候,在編譯的時候不知道該指標具體指向哪一種變數,因此需要推遲到執行的時候來確認。使用物件來訪問變數在編譯時期就能知道offset。

三、繼承對布局的影響:

單繼承對父類的布局沒有影響(由於對齊產生的填補空間也不變)

多型的影響:

1)增加vtbl和vptr

2)ctor能夠為vptr設定初值

3)dtor能夠釋放vptr

多重繼承:

複製的話,只是把從某個位址開始,指定長度的資料copy過去,編譯器能夠識別指標對應的資料的長度,因此需要位址對齊。

//如果需要把ver指向對應的vertex3d物件就需要加上偏移

ver=vertex*

(char*(

&ver3d)

+sizeof

(piont3d)

);虛擬繼承:實現方法:將virtual base class分割成兩部分,不變區域性和共享區域性。將共享部分放在最後

vtbl中新增每個virtual base class相對於該物件的offset,正向為virtual function位址,反向為virtual base class位址

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

classx classy public virtual x classz public virtual x classa public y,public z class x,乙個empty class,占用1 byte,是被編譯器安插進去的乙個char,目的是為了乙個class的兩個objects...

深度探索C 物件模型(3)

在學習完類物件的構造後,下面就需要學習類資料成員和函式成員的訪問。編譯器對於類物件的處理方式 1 對於空類,編譯器為該類新增乙個char型別的成員,用來唯一標識該類在記憶體的位置 2 使用對齊機制,當乙個類的記憶體位元組數不足4的倍數將自動補充,目的是為了定址的方便 有些編譯器對於空類的處理進行了優...

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