1.c++對數據和操作加上封裝後的佈局成本是否增大?
沒有虛函數和虛基類,封裝後的class並沒有增加成本.成員函數歲在class的聲明中,卻不出現在對象中,一個類共享一份代碼.每一個非inline的函數只有一份實例.每一個inline函數則會在其每一個使用者上產生一個函數實例.
封裝後的額外負擔主要由virtual性質引起的
a virtual 機制:用以執行一個有效率的執行期綁定
b virtual基類:用以實現多次出現在繼承體系中的虛基類只有一個單一而被共享的實例
2.c++對象模型
在現在的c++對象模型出現之前,還有過簡單對象模型和表格驅動模型,可參考p7p8.
nonstatic數據成員存在於每個對象之中,static數據成員屬於整個類,存放於具體的對象之外.static成員函數和nonstatic成員函數也存放於對象之外.
而每個對象都支持虛函數.
a 每個類產生出一堆指向虛函數的指針,存放在虛表中,虛表的第一個slot通常存放的是此對象的類型信息
b 每個對象都安插一個虛指針指向虛表
此模型的優點在於它的空間時存取時間的效率,缺點爲當nonstatic數據成員改變時,相對的應用代碼需要重新編譯.
而繼承模型則採用的是:基類子對象的數據成員直接存放在繼承類中,這樣存取效率高,缺點是這些成員改變時用戶代碼需要重新編譯.
包含虛基類的模型在下面文章詳解.
未完待續...........