GCC編譯環境C 類物件儲存結構

2021-09-25 20:23:18 字數 1270 閱讀 3896

嚴謹宣告以下結論均為gcc編譯和unix 64位系統環境下得出的結論,非gcc和unix環境結論部分結論可能有所不同

1.c++類成員變數分為兩部分:類自身宣告的成員變數,來自於基類的成員變數

2.成員變數在記憶體中的順序和宣告順序保持一致,從低位址向高位址擴充套件

3.直接繼承的情況下, 基類成員變數的位址,在子類成員變數的位址之前;

4.虛繼承的情況下,基類成員變數的位址,在子類成員變數的位址之後;

5.虛函式表指標,處於所有物件指標之前

完整的驗證**:

#includeusing namespace std;

class base;};

class a: public base;};

int main()

{ a obj;

cout<<"address obj:"<<&obj《有虛函式的情況下輸出(64位的環境,乙個指標佔8個位元組):

address obj:0x7ffee9fe99b0 #(物件起始位址)

address base_a:0x7ffee9fe99b8 #(基類的乙個成員變數起始位址)

address a:0x7ffee9fe99bc #(子類的第乙個成員變數起始位址)

address b:0x7ffee9fe99c0 #(子類的第二個成員變數起始位址)

address c:0x7ffee9fe99c4 #(子類的第三個成員變數起始位址)

address obj:0x7ffeec0d39c0 #(物件起始位址)

address base_a:0x7ffeec0d39c0 #(基類的乙個成員變數起始位址)

address a:0x7ffeec0d39c4

address b:0x7ffeec0d39c8

address c:0x7ffeec0d39cc

所以可以猜想虛函式指標被編譯器安插在了物件的頭部,指標占用固定長度位元組。

虛繼承的情況下程式輸出:

address obj:0x7ffee15359b0 #(物件起始位址)

address base_a:0x7ffee15359c4 #(基類成員變數在最後)

address a:0x7ffee15359b8 #(子類的第乙個成員變數起始位址)

address b:0x7ffee15359bc #(子類的第二個成員變數起始位址)

address c:0x7ffee15359c0 #(子類的第三個成員變數起始位址)

C 類的儲存結構

c 類的儲存 部分可用與c 的結構體 c 中最重要的就是類,那麼給你乙個類的物件,你知道它在記憶體中如何儲存的嗎?它佔 記憶體中多少個位元組?首先確定類的構成 1,資料成員 可以是內建型別,類型別。2,函式成員 虛函式,非虛函式 1 資料成員 內建型別對齊原則 內建型別就是常用的 char,shor...

C 類和物件,結構體

趁著中秋放假要多補補知識了,感覺自己對c 了解的不夠紮實,為了更好的工作,只好再來看看。c和c 規定可以用乙個結構體,裡面即可有陣列,也可以有其他變數。c中成員只能是資料,c 除了資料,還可以是函式。但是,c 提供了類這個東西,所以不需要包含函式的結構體。1,結構體 include using na...

C 類與物件探秘 結構體實現類

在c 中,class和struct幾乎沒有區別,非要說有區別,就是預設訪問許可權的區別,class預設私有,struct預設公有,這回主要通過c語言的結構體來了解一下c 類和物件的一些原理。結構體中,可以放變數,還有函式宣告,這裡設定不將函式宣告寫在結構體中。演示類1 struct animal v...