C class例項的記憶體結構

2021-04-18 21:48:44 字數 1222 閱讀 1086

這些天讓一些概念和演算法煩得不知所措,只能聽從佛祖教誨的:放下,然後上csdn去,看了兩篇關於c++的文章,這個年頭,能這樣拷問「茴」字多個寫法的人不多了,在這裡贊一下,但裡面的一些東西還是沒有挖掘乾淨,所以有了寫一些東西的衝動.

正文

在c++中,乙個類虛函式表指標和成員是如何在記憶體中組織的大家看前面的文章已經很清楚了,但如果出現一堆繼承關係後,它們又是怎樣在記憶體結構組織的,這裡並不想用組合語言來說明,而是直接看資料區的記憶體裡的內容來推演出結論。

要實驗的類繼承結構關係圖如下:

其中成員函式都是虛函式,成員變數在建構函式裡初始化成如下,便於發現內容邊界: a:

ia1=0xa1a1a1a1;

ia2=0xa2a2a2a2; b:

ib1=0xb1b1b1b1;

ib2=0xb2b2b2b2; c:

ic1=0xc1c1c1c1;

ic2=0xc2c2c2c2; d:

id1=0xd1d1d1d1;

id2=0xd2d2d2d2; e:

ie1=0xe1e1e1e1;

ie2=0xe2e2e2e2;

**如下:

int _tmain(int argc, _tchar* argv)

在監視器裡看到變數內容如下: pe

0x003e9e58        e * pb

0x003e9e58        b * pa

0x003e9e64        a * pc

0x003e9e64        c * pd

0x003e9e78        d *

綜合一下就可以得到這樣的記憶體結構:

如果類裡面沒有虛函式的話,在上表裡就沒有對應的那個虛函式表指標。

虛函式表指標指向記憶體也同樣可以看記憶體得出如下內容:

0x00417640:

03 12 41 00 (hellob)

6e 10 41 00 (helloe)

00 00 00 00 (null)

0x00417688:

6c 12 41 00 (b 析構函式)

90 11 41 00  (helloa)

37 10 41 00  (hellob)

00 00 00 00 (null)

0x0041767c:

76 12 41 00 (hellod)

00 00 00 00 (null)

C class例項的記憶體結構

c class例項 的記憶體結構 author zfive5 zidong email zfive5 yahoo.com.cn 引子 這些天讓一些概念和演算法煩得不知所措,只能聽從佛祖教誨的 放下,然後上csdn去,看了兩篇關於c 的文章,這個年頭,能這樣拷問 茴 字多個寫法的人不多了,在這裡贊一下...

C class例項的記憶體結構

引子 這些天讓一些概念和演算法煩得不知所措,只能聽從佛祖教誨的 放下,然後上csdn去,看了兩篇關於c 的文章,這個年頭,能這樣拷問 茴 字多個寫法的人不多了,在這裡贊一下,但裡面的一些東西還是沒有挖掘乾淨,所以有了寫一些東西的衝動.正文在c 中,乙個類虛函式表指標和成員是如何在記憶體中組織的大家看...

c class 記憶體對齊

今天才算把class 的記憶體對齊又多明白了一點.1.class a char a int b 2.class b char a char b int c 3.class c char a int b char c sizeof a 8 sizeof b 8 sizeof c 12 對於a,由於ch...