一:
class x{};
class y:public virtual x{};
class z:public virtual x{};
class a:public y,public z{};
1. sizeof(x)=1,雖然x為空類,但是編譯器會為其分配乙個位元組,用來區分x所建立物件。
例如: x t1; x t2; 如果沒有這個位元組,就無法區分t1和t2了,加上這個位元組就完美解決這個問題了。
2. sizeof(y)=4,sizeof(z)=4;因為為虛繼承,所以y,z必須分配乙個虛函式表(vptr)是四位元組(32位機器)。
3. sizeof(a)=8;因為y是4位元組,z是四位元組,所以為8位元組。
二:nested type 宣告 放在class的起始處,不然達不到你預料的結果。
三:data member 在類物件中的記憶體排列順序一般是和其宣告順序相同的。vptr一般在data member的後面。他們在乙個連續區塊。
四:物件和指針對data member的訪問有重大差異嗎?
如:x a,*b; a.data和b->data 有什麼差異?
1.static data member 物件和指針對static data member的訪問沒有什麼差異,因為static是儲存在全域性資料區,直接呼叫就可以。(即使是base class 的data member 也是一樣)。
2.nonstatic data member 的情況就比較複雜了,這就要知道它們在記憶體中的分配才能理解。
例如:a.data=0; 等價於 &a+(&x::data-1);(注:減1操作說明。指向data member 的指標,其offset總是被加上1,這樣可以使編譯系統區分出「乙個指向data member 的指標用以指向class的第乙個member」和「乙個指向data member的指標沒有指出任何member」兩種情況)。
五:繼承與data member
下面我們就來討論情況複雜的訪問情況吧(搞懂這部分瞬間覺得提公升了乙個level
1.只要繼承不要多型,布局如下圖:
2. 加上多型:
3.多重繼承:
4.虛擬繼承:
深入c 物件模型之執行期語意學
1.物件的構造與解構 一般而言,constructor 和 destructor的安插都會如你所預期 c 偽碼 point point 一般而言會被安插在這裡 一般而言會被安插在這裡 注意 一般而言我們會將物件放置在使用它的程式附近,這樣做可以節省不必要的物件產生操作和摧毀操作。1 全域性物件 c ...
深度探索C 物件模型之Data語意學讀書筆記
3.4繼承與data member 測試原始碼 class concrete1 class concrete2 public concrete1 class concrete3 public concrete2 對於此例子,使用vc 編譯,程式執行結果與書中討論相符,sizeof concrete3...
深度探索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 視編譯器不同而不同...