c++class 內存佈局

 1 #include <iostream>
 2 using namespace std;
 3 class base1
 4 {
 5     int a;
 6     double b;
 7     char c;
 8 };
 9 int main()
10 {
11     base1 b;
12     return 1;
13 }
vs輸出class佈局方法先選擇左側的C/C++->命令行,而後在其餘選項這裏寫上/d1 reportAllClassLayout,它能夠看到全部相關類的內存佈局,若是寫上/d1 reportSingleClassLayoutXXX(XXX爲類名),則只會打出指定類XXX的內存佈局

base1內存佈局
 1 #include <iostream>
 2 using namespace std;
 3 class animal
 4 {
 5 protected:
 6     int age;
 7 public:
 8     virtual void print_age(void) = 0;
 9 };
10 class dog:public animal
11 {
12 public:
13     dog(){this->age = 2;}
14     ~dog(){}
15     virtual void print_age(void){cout<<"Wang,my age ="<< this->age<<endl;}
16 };
17 class cat:public animal
18 {
19 public:
20     cat(){this->age = 1;}
21     ~cat(){}
22     virtual void print_age(void){cout<<"Miao,my age ="<< this->age<<endl;}
23 };
24 int main(void)
25 {
26     cat kitty;
27     dog jd;
28     animal * pa;
29     int *p = (int*)(&kitty);
30     int *q = (int*)(&jd);
31     p[0] = q[0];
32     cout<<p[1]<<endl;
33     cout<<q[1]<<endl;
34     pa = &kitty;
35     pa ->print_age();
36     system("pause");
37     return 0;
38     
39 }

內存佈局:ios

這個內存結構圖分紅了兩個部分,上面是內存分佈,下面是虛表,咱們逐個看。VS所帶編譯器是把虛表指針放在了內存的開始處(0地址偏移),而後再是成員變量;下面生成了虛表,緊跟在&[classname]_meta後面的0表示,這張虛表對應的虛指針在內存中的分佈,下面列出了虛函數,左側的0是這個虛函數的序號,這裏只有一個虛函數,因此只有一項,若是有多個虛函數,會有序號爲1,爲2的虛函數列出來。函數

編譯器是在構造函數建立這個虛表指針以及虛表的。佈局

那麼編譯器是如何利用虛表指針與虛表來實現多態的呢?是這樣的,當建立一個含有虛函數的父類的對象時,編譯器在對象構造時將虛表指針指向父類的虛函數;一樣,當建立子類的對象時,編譯器在構造函數裏將虛表指針(子類只有一個虛表指針,它來自父類)指向子類的虛表(這個虛表裏面的虛函數入口地址是子類的)。this

輸出結果:spa

相關文章
相關標籤/搜索