C 類的記憶體結構

2022-06-12 06:18:07 字數 2799 閱讀 2728

摘自jerry19880126

沒有複寫的繼承

複寫的繼承

;記憶體分布從父類到子類,依次如下:

base中有乙個虛表指標

derivedclass1繼承了base,記憶體排布是先父類後子類。

derivedclass2的情況是類似於derivedclass1的。

derivedderivedclass,由外向內看,它並列地排布著繼承而來的兩個父類derivedclass1與derivedclass2,還有自身的成員變數e。derivedclass1包含了它的成員變數c,以及base,base有乙個0位址偏移的虛表指標,然後是成員變數a和b;derivedclass2的記憶體排布類似於derivedclass1,注意到derivedclass2裡面竟然也有乙份base。

這裡有兩份虛表了,分別針對derivedclass1與derivedclass2,在&deriveddericedclass_meta下方的數字是首位址偏移量,靠下面的虛表的那個-16表示指向這個虛表的虛指標的記憶體偏移,這正是derivedclass2中的在derivedderivedclass的記憶體偏移。

;base類沒有變化

derivedclass1就已經有變化了,原來是先排虛表指標與base成員變數,vfptr位於0位址偏移處;但現在有兩個虛表指標了,乙個是vbptr,另乙個是vfptr。vbptr是這個derivedclass1對應的虛表指標,它指向derivedclass1的虛表vbtable,另乙個vfptr是虛基類表對應的虛指標,它指向vftable。

下面列出了兩張虛表,第一張表是vbptr指向的表,8表示與的偏移;第二張表是vfptr指向的表,-8指明了這張表所對應的虛指標位於記憶體的偏移量。

derivedclass2的記憶體分布類似於derivedclass1,同樣會有兩個虛指標,分別指向兩張虛表(第二張是虛基類表)。

下面來仔細看一下derivedderivedclass的記憶體分布,這裡面有三個虛指標了,但base卻只有乙份。第一張虛表是內含derivedclass1的,20表示它的虛指標離虛基表指標的距離,第二張虛表是內含derivedclass2的,12表示它的虛指標離虛基表指標的距離,最後一張表是虛基表,-20指明了它對應的虛指標在記憶體中的偏移。

虛繼承的作用是減少了對基類的重複,代價是增加了虛表指標的負擔(更多的虛表指標)。

1. 每個類都有虛指標(vptr, virtual table pointer)和虛函式表(vtbl, virtual table);

2. 如果不是虛繼承,那麼子類將父類的虛指標繼承下來,並指向自身的虛函式表(發生在物件構造時)。有多少個虛函式,虛函式表裡面的項就會有多少。多重繼承時,可能存在多個的基類虛函式表與虛指標;

3. 如果是虛繼承,那麼子類會有兩份虛指標,乙份指向自己的虛函式表,另乙份指向基類虛函式表,多重繼承時基類虛函式表與基類虛指標有且只有乙份。

c 類記憶體結構

當乙個c 類被例項化的時候,從記憶體當中會產生一塊關於該類的記憶體區域。那麼,乙個類對應的記憶體是怎麼樣的呢?類裡面有成員變數,有函式,還有虛函式等,具體自己去研究,我這裡只介紹一種方法,可以檢視乙個類的記憶體分布,好記性不如爛筆頭,幫自己記憶了。用vs系列工具的弟兄,我們以vs2008為例,用所有...

C 類記憶體結構分析

本文的目標是闡述清楚 c 的類相關的記憶體結構問題。這個問題對於已經很了解的人來說,太簡單了,這還有必要拿出來與人分享嗎?但對於那些不了解的人,始終有一層窗戶紙不能被捅破,似乎總是不能非常到位的理解本質。本文的闡述過程會分為幾個階段,類與物件的關係,物件到底是什麼,類的函式時如何被處理的,多型是如何...

從類的記憶體結構看C 繼承

先看下面這個簡單的例子,我們建立乙個基類 base class 通過簡單的繼承 inherit 產生兩個派生類 derived class 然後通過乙個基類的指標去呼叫這兩個派生類,並且呼叫類中的函式。class base void show2 class derived1 public base ...