C++ class實例的內存結構

引子 這些天讓一些概念和算法煩得不知所措,只能聽從佛祖教誨的:放下,然後上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[]){       A *pA=NULL;       B *pB=NULL;       C *pC=NULL;       D *pD=NULL;       E *pE=NULL;        pE= new E();       pA=pE;       pB=pE;       pC=pE;       pD=pE;              return 0;} 在監視器裏看到變量內容如下: pE   0x003e9e58 {iE1=-505290271 iE2=-488447262 }      E *pB   0x003e9e58 {iE1=-505290271 iE2=-488447262 }       B *pA   0x003e9e64 {iE1=-505290271 iE2=-488447262 }       A *pC   0x003e9e64 {iE1=-505290271 iE2=-488447262 }       C *pD   0x003e9e78 {iE1=-505290271 iE2=-488447262 }       D *  綜合一下就可以得到這樣的內存結構: 如果類裏面沒有虛函數的話,在上表裏就沒有對應的那個虛函數表指針。 虛函數表指針指向內存也同樣可以看內存得出如下內容: 0x00417640: 03 12 41 00 (HelloB)6e 10 41 00 (HelloE)00 00 00 00 (NULL) 0x00417688: 6c 12 41 00 (C的析構函數)90 11 41 00 (HelloA)
發佈了18 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章