自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

透析C++類對象的內存模型

開發(fā) 后端
下文著重介紹在C++語言中,如果類中有虛函數,那么它就會有一個虛函數表的指針,在類對象最開始的內存數據中出現。

雖然有許多人對C++類對象表示懷疑,但在年復一年的不斷發(fā)展中,他的使用率也在不斷提高。如過要想對C++類對象充分了解,但前提是要深入理解到底什么是C++類對象,及他是怎么運作的。

首先介紹一下C++中有繼承關系的類對象內存的布局:在C++中,如果類中有虛函數,那么它就會有一個虛函數表的指針__vfptr,在類對象最開始的內存數據中。之后是類中的成員變量的內存數據。

對于子類,最開始的內存數據記錄著父類對象的拷貝(包括父類虛函數表指針和成員變量)。 之后是子類自己的成員變量數據。對于子類的子類,也是同樣的原理。但是無論繼承了多少個子類,對象中始終只有一個虛函數表指針。

為了探討C++類對象的內存布局,先來寫幾個類和函數首先寫一個基類:然后,我們多種不同的繼承情況來研究子類的內存對象結構。

1. 無虛函數集繼承

  1.  //子類1,無虛函數重載     
  2. class Child1 : public Base     
  3. {     
  4. public:     
  5. virtual void f1() { cout << "Child1::f1" << endl; }     
  6. virtual void g1() { cout << "Child1::g1" << endl; }     
  7. virtual void h1() { cout << "Child1::h1" << endl; }     
  8. int child1;     
  9. protected:     
  10. private:     
  11. };   

2. 有一個虛函數繼承

  1.  //子類1,無虛函數重載     
  2. class Child1 : public Base     
  3. {     
  4. public:     
  5. virtual void f1() { cout << "Child1::f1" << endl; }     
  6. virtual void g1() { cout << "Child1::g1" << endl; }     
  7. virtual void h1() { cout << "Child1::h1" << endl; }     
  8. int child1;     
  9. protected:     
  10. private:     
  11. };   

虛擬繼承的子類的內存結構,和普通繼承完全不同。虛擬繼承的子類,有單獨的虛函數表, 另外也單獨保存一份父類的虛函數表,兩部分之間用一個四個字節(jié)的0x00000000來作為分界。

子類的內存中,首先是自己的虛函數表,然后是子類的數據成員,然后是0x0,之后就是父類的虛函數表,之后是父類的數據成員。如果子類沒有自己的虛函數,那么子類就不會有虛函數表,但是子類數據和父類數據之間,還是需要0x0來間隔。

因此,在虛擬繼承中,子C++類對象和父類的數據,是完全間隔的。存放子類自己的虛函數表和數據,中間以0x分界,最后保存父類的虛函數和數據。如果子類重載了父類的虛函數,那么則將子類內存中父類虛函數表的相應函數替換。

【編輯推薦】

  1. 簡介學習C++總結之談
  2. 對C++庫函數進行學習探索總結筆記
  3. C++類庫設計的基本構思與方法
  4. C++語言真的還有市場價值?
  5. C++類庫設計的基本構思與方法
責任編輯:chenqingxiang 來源: pcppc.cn
相關推薦

2011-06-21 10:17:41

c++內存模型

2010-01-28 13:45:06

C++數組

2010-01-18 09:39:25

C++語言

2010-01-19 14:28:41

C++ main()函

2010-01-22 13:45:36

C++代碼

2010-01-21 10:04:14

C++語言

2010-01-20 14:13:33

C++變量

2010-01-25 14:18:46

C++對象模型

2010-01-27 10:13:22

C++類對象

2020-10-23 18:46:58

C++程序類別

2011-07-20 13:40:09

拷貝構造函數

2011-06-01 10:19:41

基類對象派生類對象

2024-07-25 14:18:29

2010-01-21 13:33:44

C++基類

2010-01-15 18:35:25

C++的類

2011-04-11 09:47:50

C++內存管理

2010-01-28 13:27:12

C++類定義

2010-01-21 13:48:30

C++基類

2024-12-11 08:00:00

移動語義C++

2011-06-16 09:28:02

C++內存泄漏
點贊
收藏

51CTO技術棧公眾號