空基類的大小為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 視編譯器不同而不同...