《C++ 物件模型》一書深入剖析 C++ 底層實作機制。本文整理核心知識點,涵蓋物件佈局、虛函數表、繼承模型、建構函式語意等,助你透視 C++ 「引擎蓋下」的運作邏輯。
| 類型 | 儲存位置 |
|---|---|
| non-static 資料成員 | 類別物件內部 |
| static 資料成員 | 所有物件之外(data segment),僅一份實體 |
| static / non-static 成員函式 | 類別物件之外(代碼段) |
| virtual 函式 | 不佔物件空間,透過 vptr/vtable 機制 |
obj->vptr[vtable_index] 間接跳轉,實現動態繫結。衍生類別物件包含基底類別子物件,vptr 指向衍生類別的 vtable(覆寫函數已更新)。
物件包含多個基底子物件,每個基底有自己的 vptr,衍生類別可能有多個 vptr。
無論在繼承鏈中出現多少次,虛擬基底類別在衍生物件中永遠只有一個實體。編譯器透過額外指標或偏移量實現共享,增加存取開銷但解決菱形繼承問題。
struct vs class
struct:預設 public 繼承/成員,體現「資料聚合」概念。class:預設 private,體現 ADT(抽象資料類型)封裝概念。指標大小固定,其類型僅告知編譯器如何解讀所指記憶體(解引用大小、算術運算步長)。指標轉型不改變位址值,只改變編譯器對該記憶體的「解讀方式」。
以衍生類別物件初始化基底類別物件(或傳值給基底參數)時,衍生部分被「切掉」,僅保留基底子物件。避免方式:使用指標/參考傳遞、多型設計。
理解物件模型能幫你:預估物件大小、避免切割陷阱、優化虛函數呼叫、正確管理資源生命週期。C++ 高效能的代價是程式設計師必須理解其底層契約。