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

2021-07-28 06:39:34 字數 3444 閱讀 9152

在class中,乙個non-inline member function只會誕生乙個函式實體,而inline function會在每乙個使用者(模組)身上產生乙個函式實體。

個人理解:inline函式在每乙個使用了這個函式的地方都會進行**替換,所以會產生多個函式實體,而成員函式只會有乙個實體,並且多個該class的物件公用相同的函式(即只含有該函式的入口位址)。

virtual function 機制: 用以支援乙個有效率的「執行期繫結」(virtual binding)

virtual base class 多次出現在整合體系中的base class,有乙個單一而被共享的實體。

簡單物件模型(****** object model)

members本身不放在object中,只有「指向該member的指標」才放在object內,可以避免member有不同的型別,因而需要不同的儲存空間所導致的問題。

**驅動模型

目的:使所有該類的物件有一致的表達方式,該物件模型將資料成員和函式成員分成兩個表,class object中則只有兩個指向兩個**的指標。

【注】該member function table成為支援virtual function的一種方案。

c++物件模型(the c++ object model)

特點:non-static data members被配置於每乙個class object中,也就是說每乙個物件都擁有它獨一無二的變數成員。

static data members則被存放在所有的class object 外。

static和nonstatic function members也被放在所有的class object之外

virtual functions則以兩個步驟來支援它。

①每乙個class有乙個只想virtual functions的指標,放在**之中,這個**稱為 virtual table(vtbl)

②每乙個class object都新增了乙個指標,只想相關的virtual table,通常這個指標被稱為vtpr,vtpr的設定和重置都用該class的constructor,destructor和copy assignment運算子自動完成,每乙個class關聯的物件資訊也由virtual table指出

缺點:如果應用程式**本省未曾更改,但是用到的那些nonstatic data member修改,也要重新編譯這些**。

關於繼承的模型(多重繼承)

可以採用base table,將所有的父類位址全都放在乙個表中,該子類中增加乙個指標指向該錶即可。

優點:每乙個class object對繼承都有一致性,不用改變class object本身就可以放大,縮小或者更改base class table

c struct在c++中乙個合法用途:是當你要傳遞乙個複雜的class object的全部或者部分到某個c含糊中時,struct宣告可以將資料封裝起來,並且保證與c相容的空間布局,然而這項保證只在組合(composition,這裡我尚不清楚什麼意思)的情況下而非整合的情況下,否則編譯器會決定是否應該有額外的資料成員被安插到base struct subobject中去。

c++程式設計模型直接支援的三種程式設計典範

1.程式模型

2.抽象資料型別

3.物件導向模型

在oo paradigm中,程式設計師需要處理乙個未知實體,型別有無限的可能,在真正到達特定的執行期之前,是無法真正解析出它的型別的,在c++中只有通過pointer和reference的操作才能完成。

相反的,在adt paradigm中,程式設計師處理的是乙個擁有固定而單一型別的實體,在編譯期就已經完全定義好的。

c++中,多型只存在於乙個個的public class體系中,nonpublic的派生行為以及型別為void*的指標可以說是墮胎,但是並不被語言明白支援,也就是說它們不許由程式設計師通過明白的轉型才做來管理

c++以下列方式支援多型:

①把乙個派生類的指標型別轉化成乙個公有繼承的雞肋指標;

father* ptr=new son();
②由虛函式機制

father->eat()

//實際使用的是兒子的吃飯動作

③由dynamic_cast和typeid運算子

if(son*sptr=dynamic_cast

(fptr))......

virtual機制在執行期根據object的真正型別解析出到底哪乙個函式實體被呼叫。

表示乙個類物件需要多少記憶體?

①nonstatic data members的總和大小

②加上記憶體對齊所增加的空間(使bus的傳輸率達到最高效率,該空間可能位於成員之間,也可能在集合體邊界)

③加上為了支援virtual而在內部產生的負擔(overhead)

指標的型別

zooanimal *a;

int*b;

array*pta;

三者有什麼不同?

以記憶體的觀念來說,沒有什麼不同,它們都需要足夠的記憶體來存放乙個機器位址,指標之間的差異,不在於其表示的形式不同或者內容(位址)不同,而在於它所定址出來的object型別不同,也就是說,「指標型別」會導致編譯器如何解釋某個特定位址中的記憶體中內容以及其大小。

而void*指標,只含有乙個位址,而不能知道該位址中object的型別。

由上可知,cast**型)其實是一種編譯器指令,大部分情況下它不會改變乙個指標所含的真正位址(那麼什麼時候會改變呢?不清楚),它只影響「被指記憶體中內容和記憶體大小」的解釋方式。

乙個animal類的指標和乙個bear類的指標有什麼不同?

它們都只想動物類的第乙個位址,差別在於覆蓋範圍不同。pbear指標覆蓋了整個空間1000-1016,而pzoo指標只覆蓋了1000-1008,不能用pzoo來處理pbear中的任何成員(除了虛函式成員);

總結:當乙個基類物件被直接初始化為乙個派生類物件時,派生類就會被切割,以塞入較小的基類物件中,多型將不再呈現,而乙個嚴格的編譯器可以在編譯時期解析乙個「通過該object出發的virutal function呼叫操作」(這裡不理解?)

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

1 封裝後的成本會增加嗎?對於乙個普通的class,即不含虛函式,沒有繼承virtual base class 雖然通常不含有虛函式說明不存在繼承體系 封裝後,並沒有增加成本,data members直接放在object內,就像在struct裡的表現一樣,而member functions雖然在cl...

《深度探索C 物件模型》讀書筆記 第一章

深度探索c 物件模型 讀書筆記 前言 知其然,亦知其所以然 1 本書為中高階c 程式設計師所寫 2 本書專注於 各種c 物件模型支援的底層實現機制 3 程式設計師應了解底層實現模型,才能成為高手。lippman 1 任何物件模型都需要的三種轉換風味 1 與編譯器息息相關的轉換 2 語言語義轉換 3 ...

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

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