《深入探索C 物件模型》第一章 關於物件

2021-08-02 21:32:23 字數 2095 閱讀 7494

1、封裝後的成本會增加嗎?

對於乙個普通的class,即不含虛函式,沒有繼承virtual base class(雖然通常不含有虛函式說明不存在繼承體系),封裝後,並沒有增加成本,data members直接放在object內,就像在struct裡的表現一樣,而member functions雖然在class內宣告,卻不出現在object裡(這個後面會說到,其實函式會被簽名化,轉換為nomember的形式呼叫)

所以c++在布局以及訪問時間上主要的額外負擔是由virual引起的

(1)virtual fucntion機制:用以支援乙個有效率的執行期繫結(虛函式表)

(2)virtual base class:用以實現多次出現在繼承體系中的base class,有乙個單一而被共享的例項(虛表會被擴充,加入偏移量)

另外還有一些多重繼承下的額外負擔,發生在乙個derived和其第二或者候機之間base class的轉換之間(這裡同樣需要對pointer or reference進行偏移操作)

2、c++物件模型

前面幾種就不贅述了,主要來**一下虛函式表模型:

nonstatic data members被配置於每個class object內,static data members則被放在class object之外,static和nonstatic function members放在class object之外,關於virtual則以下面兩個步驟支援:

(1)每個class產生出一堆指向virtual functions 的指標,放在**中,此**稱為virtual table(vtbl)

(2)每個class object被安插乙個指標,指向相關的virtual table(vtbl),通常這個指標稱為vptr。vptr的設定和重置由construct、destructor、和copy assignment運算子自動完成,每乙個class所關聯的type_info object也經由virtual table被指出來,通常放在**的第乙個slot。

這裡解釋一下type_info object是幹什麼用的,實際上是用來支援runtime type identification,即rtti,那麼這個rtti又是用來幹什麼的呢?通過執行時型別資訊程式能夠使用基類的指標或引用來檢查這些指標或引用所指的物件的實際派生型別。rtti提供了以下兩個非常有用的操作符:

(1)typeid操作符,返回指標和引用所指的實際型別。

(2)dynamic_cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指標或引用。

3、指標的型別

我們來**一下乙個簡單的問題,乙個指向int的指標和指向char的指標有什麼區別呢?從記憶體的需求來看,其實沒什麼不同,都是乙個word大小。其實指標的型別會教導編譯器如何解釋某個特定位址中的記憶體內容及其大小,即對這段記憶體裡的內容的解釋方式。比如int *p,編譯器會知道內容為int,而且邊界大小為4個位元組。話有說回來,對於void*型別的指標咋辦呢?很遺憾,編譯器不知道怎麼處理。乙個指標的型別將在編譯期間決定以下兩點:

(1)固定的可用介面,也就是說某個型別的指標只能有該型別應有的操作

(2)該介面的access level,對於class來說

對於以下**,我們來考慮兩個問題:

/*

zooanimal是基類,rotate虛函式,bear是派生類

*/bear b;

zooanimal za = b;

za.rotate();

(1)為什麼rotate()所呼叫的是zooanimal例項而不是bear例項呢?

(2)如果初始化函式將乙個object內容完整拷貝到另乙個object區,為什麼za的vptr不指向bear的virtual table?

對於第乙個問題,利用物件顯示呼叫,是不會發生多型的,並沒有通過虛表進行索引,而是在編譯期間直接編碼(即成員函式會被修改簽名,直接轉換為nomember形式呼叫)

對於第二個問題,拷貝構造的時候,編譯器合成的建構函式並不會對vptr進行覆蓋,除非自己定義乙個過載版本拷貝建構函式,對其進行覆蓋

第一章的知識點就說到這裡...省略了一些自己感覺不是很難懂的東西,吃飯去...,下午繼續更新後續章節,秋招,fighting!!!

《深度探索C 物件模型》第一章 關於物件

在class中,乙個non inline member function只會誕生乙個函式實體,而inline function會在每乙個使用者 模組 身上產生乙個函式實體。個人理解 inline函式在每乙個使用了這個函式的地方都會進行 替換,所以會產生多個函式實體,而成員函式只會有乙個實體,並且多個...

C 物件模型 關於物件 第一章

c 物件模型的主要優點在於它空間和訪問時間的效率 主要缺點是,如果應用程式 本身並未改變,但所用的class object的nonstatic data members有所修改 可能是增加 移除或修改 那麼那些應用程式 同樣得重新編譯。關於這點,前面的的 驅動模型就提供了較大的彈性,因為它多提供了一...

C 物件模型 關於物件 第一章筆記

讀完c 物件模型書後,做乙個筆記整理 第一章 關於物件 第二章 建構函式語義學 第三章 data語義學 第四章 function語義學 第五章 構造拷貝解析語義學 第六章 執行期語義學 第七章 在物件模型的尖端 c 增加封裝後並未增加物件布局開銷,基布局及訪問時間額外負擔是由virtual引起 c ...