C++ class執行個體的記憶體結構

來源:互聯網
上載者:User

 

C++ class執行個體的記憶體結構 Author:zfive5(zidong)Email:zfive5@yahoo.com.cn  引子 這些天讓一些概念和演算法煩得不知所措,只能聽從佛祖教誨的:放下,然後上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)
37 10 41 00 ( HelloC) 00 00 00 00 (NULL)  (以前有錯誤,已改正,謝謝網友danielhua 指出) 0x0041767c:  76 12 41 00 (HelloD)00 00 00 00 (NULL)  以上實驗分析是在vc++ 2005環境下進行的,估計vc6.0也是如此的記憶體分布,但gc++一定有所不同(以前看過一些相關的文章,今天本來想下載一個cygwin0528安裝包驗證一下,結果g了半天,全都是死串連,等回到北京再去實驗一下吧)  向拔掉的第一顆牙,說再見,拔牙的痛苦的耐人尋味!以後一定更加珍惜愛護自己的牙!!!   相關文章 李 星
《淺析C++中的this指標》http://blog.csdn.net/starlee/archive/2008/01/24/2062586.aspx 李 星
《C++中虛函數的調用及對象的內部布局》http://blog.csdn.net/starlee/archive/2008/02/13/2089358.aspx  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.