深入c 物件之data語意學

2021-07-28 06:26:20 字數 1088 閱讀 1110

一:

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