虛 繼承類的記憶體大小計算

2021-06-21 07:42:30 字數 1637 閱讀 5875

虛函式的工作原理涉及到了虛函式表指標vptr和虛函式表vtbl,當乙個物件呼叫了虛函式,實際的被呼叫函式通過下面的步驟確定:找到物件的 vptr 指向的 vtbl,然後在 vtbl 中尋找合適的函式指標。如果類定義了虛函式,該類及其派生類就要生成一張虛函式表,即vtable。而在類的物件位址空間中儲存乙個該虛表的入口,佔4個位元組,這個入口位址是在構造物件時由編譯器寫入的。所以,由於物件的記憶體空間包含了虛表入口,編譯器能夠由這個入口找到恰當的虛函式,這個函式的位址不再由資料型別決定了。因為包含了虛函式的入口(4位元組),個人感覺就是個指標。所以我們在計算類的大小的時候就要將其包含在內。

首先來乙個不同的類繼承的例子,也是眾多博主舉的例子

class a   

; class b

}; class c

virtual void func1()

};class d: public a, public c

virtual void func1()

};

class e: public b, public c

virtual void func1()

};int main(void)

;class base1: virtual public commonbase

virtual void print2()

private:

int b1;

};class base2: virtual public commonbase

virtual void dump2()

private:

int b2;

};class derived: public base1, public base2

void dump2()

private:

int d;

};

size(derived)大小為32,套用各位博主的分析圖

class derived size(32):

+---

| +--- (base class base1)

| |

| |

| | b1

| +---

| +--- (base class base2)

| |

| |

| | b2

| +---

| d+---

+--- (virtual base commonbase)

| co

+---

好了 ,以上是我根據網上資料學習到的

然後我自己修改了下例1中的**

class a

; class b

}; class c

virtual void func1()

};class d: public a, public c

virtual void func1()

};

class e:virtual public b, virtual public c

virtual void func1()

};int main(void)

{ cout<<"a="<

C 類所佔記憶體大小計算

c 類所佔記憶體大小計算 文章出處 作者 vision chen yeah.net 說明 筆者的作業系統是32位的。class a sizeof a sizeof a 1 明明是空類,為什麼編譯器說它是1呢?空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會...

c 類占用記憶體大小計算

c 類所佔記憶體大小計算 說明 筆者的作業系統是32位的。class a sizeof a sizeof a 1 明明是空類,為什麼編譯器說它是1呢?空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得...

C 中虛函式繼承類的記憶體占用大小計算

位元組對齊的原理見鏈結注意64位系統虛函式指標佔8位元組,32位佔4位元組 原帖中寫到 求sizeof d 的時候,需要明白,首先vptr指向的虛函式表中儲存的是類d中的兩個虛函式的位址 只有乙個虛基類位址指標 然後存放基類c中的兩個資料成員ch1 ch2,注意記憶體對齊,然後存放資料成員d,這樣4...