首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

深度探索 C++ 物件模型(二):簡單物件模型、表格驅動模型與 C++ 模型演進

     編輯:VC 教學

讀者建議:跳著讀、再回頭

讀者史列因建議:第一章是總覽,全看懂後面就沒必要看了。內容後面都有詳細介紹,開始只要有大概印象即可。書中許多內容前後重複。建議先不管看懂沒,只管往後看,之後再從頭看幾遍,效果好得多。這是閱讀技術書的好方法:遇不懂放下、打打紅警(自稱高手)或跳過,繼續研究。

簡單物件模型

書上範例(註標為 slot 索引):


class Point {
public:
    Point(float xval);           // 1
    virtual ~Point();            // 2
    float x() const;             // 3
    static int PointCount();     // 4
protected:
    virtual ostream& print(ostream& os) const; // 5
    float _x;                    // 6
    static int _point_count;     // 7
};

每個 Object 是一系列 Slots,每個 Slot 指向一個 member。

表格驅動物件模型

建構物件時會有類似指標陣列的東西,存放類別資料成員記憶體位置指標、成員函式位址指標。為讓類別產生的所有物件實體有標準表達,採用雙表格:

  • 資料成員表:存放所有資料成員
  • 成員函式表:存放所有成員函式位址
  • 類別物件本身持有指向這兩個表的指標

不恰當但直觀的類比:寫字樓

  • 寫字樓 = 類別
  • 樓內的人 = 資料成員
  • 租戶公司 = 成員函式
  • 物業管理登記人員花名冊 = 資料成員表
  • 大廳牆上公司列表牌 = 成員函式表
  • 實體「雷神大廈」 = 類別物件

透過大廳牌找公司、透過花名冊找人,即物件構造過程。

C++ 物件模型

從簡單模型演進,優化記憶體空間與存取時間,引入虛函式表方案:

  • 每個類別產生一堆指向虛函式的指標,放在表格中(vtbl)
  • 每個類別物件增加一個指標(vptr),指向相關虛函式表
  • vptr 由每個類別的建構函式、解構函式、copy assignment 自動設定/重置

寫字樓類比進階

物業為提高效率,對長期穩定的公司/人員不再登記,只登記不穩定或不確定者。對應應用程式需重新編譯(為保持連貫請理解性思考,勿拘泥字面)。

結論

C++ 物件模型 vs 雙表格模型:提高空間與存取時間效率,犧牲彈性。閱讀《深入 C++ 物件模型》感覺每個字都是重點。反覆閱讀後有些開竅,繼續努力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved