虛函式的工作原理涉及到了虛函式表指標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...