封裝的開銷開銷
c++較c多了一些封裝的特性,增加封裝特性不會引起布局(layout)的開銷,c++類的成員資料直接包含在每個物件內部,而noninline成員函式雖然在類中申明,但不會欻現在每個物件內部,每個noninline的成員函式僅產生乙個唯一的函式實體。而inline函式在會為每個物件生成乙個函式實體。因此c++類的封裝並未帶來任何空間或執行期間的不良,僅僅因為virtual的原因帶來一些時間上的額外負擔。
虛函式支援執行時邦定機制
在乙個多重繼承的結構中,虛基類支援單個共享的例項
如:class cbase{};
class csub1 : virtual public cbase{};
class csub2 : virtual public cbase{};
class csub : public csub1,public csub2{};
在csub類的乙個例項中僅包含乙個cbase的例項
物件模型
c++中,共有兩類資料成員static、nonstatic,三類成員函式:static、nonstatic、virtual
簡單物件模型
這種模型的主要目的是降低編譯器在編譯過程中空間占用和生成的最終程式執行效率上的複雜性。在這種模型中,每個物件是乙個時隙序列,每個時隙指向乙個成員。物件的成員按照成員在類的宣告中的順序分配時隙,每個資料成員和函式成員都分配到乙個時隙。
在此模型中,物件的每個成員沒有分配到物件內部,物件內部僅僅存放乙個成員變數的位址。這樣可以避免因為不同的資料型別需要不同大小的儲存空間。在物件內部的成員按照時隙的索引來表識
在現實中,這種物件模型沒有使用,但其中索引和時隙編號的概念延伸到了c++ 指向成員(pointer-to-member)的概念
表驅動模型
所有的資料成員和成員函式各存放到表中,物件的例項包含指向這兩個表的指標。成員函式表是時隙序列,每個時隙代表乙個成員函式。資料成員表直接存放資料成員
這種模型也沒有使用到c++模型中,但成員函式表支援了是高效執行時解析虛函式的傳統實現
c++物件模型
nonstatic 資料成員直接在每個物件的內部存放,靜態的資料成員、所有的成員函式存放到物件的外部,虛寒樹通過如下方法來實現:
每個類生成一張包含所有指向虛函式的所有指標的表(虛表)
類的每個例項化物件包含乙個指向虛表的指標(vptr),設定、刪除和重置vptr都由建構函式、析構函式、拷貝建構函式來自動完成。和每個物件相關的用來支援執行時型別標識的type_info資訊也存放在虛表中,通常是該錶的第乙個時隙。
物件差異
c++支援三種programming paradigm。
順序模型,因為c++完全相容c,而c支援順序模型
adt,抽象資料型別模型
物件導向模型
建議在程式內部僅適用一種programming paradigm,否則會引起一系列比較複雜的問題:具體問題參見
個人的理解:adt模型是一種基於物件的機制如:vb6.0是基於物件的模型,他提供了物件,物件內部可以封裝方法、屬性等內容,但他沒有提供物件導向的繼承和多型,僅僅提供了封裝機制。而面向象的模型提供了所有的封裝、繼承、多型機制。
《深度探索c 物件模型》筆記總結(一)
1.虛函式 c 多型的基本實現,沒什麼好說的,詳細見如下打包筆記 虛函式 2.虛基類 用來處理菱形繼承時候,在派生類中資料有重複的問題,見筆記 虛基類 三種物件模式 這個沒什麼好說的,在object中儲存的是位址 指標 按序指向每個宣告的函式或者資料。此時乙個class object的大小計算 指標...
深度探索C 物件模型之C 物件模型筆記
0.菜鳥覺得,在看這本書的時候最好切換角色,把自己的思維轉換成編譯器開發者,去考慮問題,這樣會容易理解些.當然這樣很難,就想著自己要解決什麼樣的問題好了 1.在c 中,類的資料成員有兩種 靜態和非靜態 成員函式有三種 靜態,非靜態 虛函式。之所以這樣分,大概是因為在設計c 物件模型時,非靜態的資料成...
《深度探索c 物件模型》學習筆記
封裝並未給c 帶來任何的空間或執行期的不良後果,c 在布局和訪問時間上的主要額外負擔由虛擬化引起。包括 1 virtual function機制。用以支援乙個有效率的 執行期繫結 2 virtual base class機制。用以實現 多次出現在繼承體系中的base class,有乙個的單一而被共享...