c 物件模型研究7 站在物件模型的頂端

2021-07-13 19:25:30 字數 2109 閱讀 4553

在c++發明階段,c++之父stroustrup和貝爾實驗室的c++小組對原先的巨集方法進行了修訂,對其進行了簡化並將它從預處理範圍移入了編譯器。這種新的**替換裝置被稱為模板,而且它變現了完全不同的**重用方法:模板對源**重用,而不是通過繼承和組合重用物件**。當使用者使用模板時,引數由編譯器來替換,這非常像原來的巨集方法,卻更清晰,更容易使用。

未使用的template member function不應該被例項化。

對於template的錯誤檢查,只有在例項化操作時才會進行型別型別檢查,而所有的語彙(lexing)錯誤和解析(parsing)錯誤都會在處理template宣告的過程中被表示出來。也就是用到了語法分析器。

在目前的編譯器中,面對乙個template宣告,在它被一組實際引數例項化之前,只能施以有限的錯誤檢查。

template中的名稱決議法,分為 scope of the template definition 和 scope of the template instantiation.

template之中,對於乙個nonmember的決議結果,是根據這個name的使用是否與「用以例項化該template的引數型別」有關而決定。如果互不相關,則使用「scope of the template declaration」來決定name,否則以「scope of the template instantiation」來決定name。

函式的決議結果,只和函式的原型有關,和函式的返回值沒有關係。

對於member function的例項化行為,編譯器設計者需要考慮以下3種問題:

1.編譯器如何找打函式的定義? --> 答案是產生template program text file, 有點類似header

2.編譯器如何能夠只例項化程式中用到的member function? --> 解法方法之一,是忽略此項要求,只要class的object被例項化,就全部產生出來;另乙個解決方法是模擬鏈結操作,檢測看看哪個函式真正需要,然後只為他們產生例項

3.編譯器如何組織member definition在多個 .o檔案中被例項化?  -->方法是產生多個例項,但只在鏈結器中儲存乙個。

對於member function,每個member function的位址都被放在active classes的virtual table中。

如果virtual table被產生出來,每個virtual function 都必須被例項化。

欲支援exception handling,編譯器的主要工作是找到catch子句,以處理被丟擲來的exception。

dynamic_cast運算子可以在執行期決定真正的型別。

如果downcast是安全的,也就是說base type pointer指向乙個derived class object。這個運算子會傳回被適當轉換過的指標。

如果downcast是不安全的,這個運算子會傳回0。

dynamic_cast的成本是編譯時會產生乙個型別描述器。

執行期對乙個class指標施以dynamic_cast運算子,會返回true或false,true指的是返回真正的位址,false表示沒有指向任何物件。

dynamic_cast運算子也適用於reference。

若將乙個reference設為0,會引起乙個臨時物件被產生出來,該臨時物件的初值為0,這個reference然後被設定成該臨時物件的別名。

如果真正參考到derived class,downcast會繼續執行程式,反之,會跑出乙個bad_cast exception操作。

typeid運算子

typeid運算子傳回乙個const reference。型別為type_info.

rtt1只適合於多型類,但是typeid同時也適用於內建型別。 如typeid(double) 會傳回乙個 const type_info&。這個時候type_info object是靜態取得,而非執行期取得。

傳統的c++物件模型提供有效率的執行期支援。這份效率,再加上與c之間的相容性,造成了c++的廣泛被接受度。然而,在某些領域方面,像是動態共享函式庫、共享記憶體、以及分布式物件方面,這個物件模型的彈性還是不夠。

《essential com》

《inside com》

閱讀順序《essential com》一二章->《inside com》

參考:《深度探索c++物件模型》

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...