1. 程式人生 > >[讀書筆記] 深入探索C++物件模型-第一章《關於物件》

[讀書筆記] 深入探索C++物件模型-第一章《關於物件》

最新在看深入探索C++物件模型(Inside C++ object model),看的同時針對一些之前沒有留意或者理解不深的內容整理一下讀書筆記,方便之後複習,也希望可以幫助到有同樣疑惑的人。

下面是第一章的內容整理,注:以下圖片來源於原書

關於物件(Object Lessons)

1. C++在佈局以及存取時間上的額外負擔是由virtual引起。

這裡指的是C++中虛擬函式以及虛繼承機制,虛擬函式是C++中實現多型的主要手段,虛繼承則是為了解決諸如菱形繼承爺爺以上類在孫子以下類中出現多分重複資料提出的,詳細的內容在後面的章節中由介紹,之後的筆記會再詳細做整理。

2. 幾種可能的物件模型

a. 簡單物件模型:所有實際的成員不儲存在物件本身的空間中,而是物件中通過指標的形式指向實際儲存的成員,雖然該模型沒有實際應用於真正的C++編譯器上,但是關於索引和slot數目的觀念,被應用到了C++的“指向成員的指標”觀念之中(成員的指標在第三章中有詳細討論,之後會做記錄)。


b. 表驅動物件模型:這個模型與上面的模型有一些類似,不過在這個模型中,成員資訊被分成兩部分,資料成員和成員函式,,雖然這個模型也沒有應用於實際的C++編譯器上,但是成員函式表這個概念卻是大部分的虛函數借鑑的實現方式。


c. C++物件模型:這個是目前實際編譯器所採用的物件模型,是由Stroustrup經由簡單物件模型而來,在此模型中,非靜態成員配置於每一個類物件中,靜態成員則被存放類物件之外(靜態儲存區),成員函式(靜態以及非靜態)也被放置在類物件之外,至於虛擬函式,則通過如下兩個步驟實現:一、每個類產生一堆指向虛擬函式的指標放在一個表格中,該表格稱為虛表(virtual table: vtbl),注意這個虛表不會放到類物件中。二、每個類物件會加入一個指標(vptr),指向相關的虛表,該指標的設定和重置會由相應類的建構函式,解構函式,以及拷貝建構函式自動完成,每個類所關聯的type_info object(用以支援RTTI: runtime type identification),通常會儲存在表格的第一個slot

處。該模型的優點在於空間以及存取時間的效率,缺點是如果類的非靜態成員有所改變,即便是客戶端的程式碼沒有改變,客戶端程式碼同樣需要重新編譯。


一個實際的例子,類X定義了一個拷貝建構函式,一個虛解構函式,一個虛擬函式foo(),則一個典型的X例項化物件的沒存佈局如下:


3. 關於類物件的大小(之後還會有詳細的討論),一般而言,一個類物件要考慮,所有非靜態成員大小的總和 + 任何由於對齊(為了保證匯流排的運輸量的最高效率,物件大小會向上調整為某個值的整數倍,對於32bit機器,該值通常為4)操作而加上去的空間 + 為了支援虛擬(virtual)機制而產生的額外負擔(指向虛表的指標,指向虛基類的指標)。

4. 關於指標(或者引用,因為本質上來講引用是通過指標來實現的),以記憶體需求的觀點來說,指向一個整數的指標和指向某個物件的指標,或者指向某個模板物件的指標,他們沒有什麼不同,他們的內容都是一個機器地址,指向不同型別的指標,既不在其指標的表示法不同,也不在其內容(一個地址)不同,而是在其所定址出來物件型別不同,也就是說,“指標型別”會教導編譯器如何解釋某個特定地址中的記憶體內容及其大小,在C++中,多型的一種使用方法就是使用基類的指標或者引用指向派生類, 例如 ZoomAnimal za("Joey"); ZoomAnimal* pza = &za; 則目前的記憶體佈局可能如下:


加上多型之後的記憶體佈局:


相關推薦

[讀書筆記] 深入探索C++物件模型-第一《關於物件

最新在看深入探索C++物件模型(Inside C++ object model),看的同時針對一些之前沒有留意或者理解不深的內容整理一下讀書筆記,方便之後複習,也希望可以幫助到有同樣疑惑的人。 下面是

[讀書筆記] 深入探索C++物件模型-第四-Function語義學(中)

繼續整理第四章的內容,注:以下部分圖片來自於原文 1. 單繼承情況下的虛擬函式呼叫:  對於多型虛擬函式的呼叫(通過基類指標或者引用),例如ptr->z();,需要知道兩個資訊:     a. ptr所指物件的真實型別,這可以使我們選擇正確的z()實體;     b.

深度探索C++物件模型-----第一筆記

第一章:關於物件 1.1 C++模式   關於操作符過載的問題: type& operator[](int index) {     assert(index < dim && index >= 0); &nbs

讀書筆記《Effective c++》 條款12 複製物件時勿忘其每一個成分

名詞:   copying函式 = 拷貝建構函式 + 賦值操作符 重點是:當你自己要編寫一個copying函式時,請確保:   a.複製所有local成員變數   b.呼叫所有base class內的適當的copying函式。(拷貝建構函式是在初始化列表呼叫base c

讀書筆記之《資料結構》---第一 緒論

本章目錄: 什麼是資料結構 基本概念和術語 抽象資料型別的表示與實現 演算法和演算法分析 什麼是資料結構 書中介紹了三個資料結構的例子分別是:表、樹、圖 基本概念和術語 資料: 是對客觀事物的符號表示,在電腦科學中是指所有能輸入到計算機中的並被計算機程式處理

深入應用C++11》第一

1,using可重定義一個模板,該模板既不是類模板也不是函式模板,是一種新的模板形式:模板別名 templte <typename T> using func_t=void (*)(T,T); //使用func_t模板 func_t<in

讀書筆記之《高等數學》---第一 函式與極限

第一節 對映與函式 對映 對映:兩個非空集合X、Y,如果存在法則f使得X中的每個元素x在Y中都有唯一一個確定的元素y,則稱法則f是從X到Y的對映 像:y稱為x的像 原像:x稱為y的原像 定義域:X集合稱為定義域 值域:Y集合稱為值域 構成一個對映必須具備的三個要

深入探索C++物件模型(五)

https://www.cnblogs.com/lengender-12/p/6970496.html 構造、解構、拷貝語意學(Semantics of Construction,Destruction, and Copy) 一般而言,class的data member應該被初始化,並且只在

深入探索C++物件模型:Default-Constructor的構造操作

那麼,什麼時候才會合成出一個default constructor呢?——當編譯器需要它的時候!此外,被合成出來的constructor只執行編譯器所需的行動。 [x] “任何class如果沒有定義default constructors,就會被合成出一個來”?——錯 [x] “編譯

深入探索C++物件模型(四)

https://www.cnblogs.com/lengender-12/p/6959222.html Function語意學(The Semantics of Function) static member functions不可能做到的兩點:(1)直接存取n

深入探索C++物件模型(九) 解構函式 (以及顯式定義的解構函式問題、解構函式Rules of Three)

  如果類沒有定義解構函式,那麼只有類中含有成員物件(或者本類的基類)擁有解構函式的情況下,編譯器才會合成一個出來,否則解構函式被視為不要,也就不需要合成。例如,如下類,雖然Point類擁有虛擬函式:class Point {  piblic:       Point(flo

深入探索C++物件模型(六) Function語義學

1. 非虛成員函式指標(非靜態)。取一個非靜態成員函式的地址,如果該函式是非虛擬函式,則得到的是它在記憶體中的真正地址,但是該地址並不完全,需要繫結與具體的類例項(物件)之上,藉助物件的地址(this指標)才可以被呼叫,例如:一個成員函式指標double (Point::* 

深入探索C++物件模型》第六 執行語意學

#include <iostream> class X { public: bool operator==(const X& o) { return ((this == &o)?true:false); } ~X() { std::co

深入探索C++物件模型》讀後總結

第一章:關於物件 1:C++每個類物件的記憶體大小由:類中非靜態成員記憶體的和,指向虛擬函式表的指標和記憶體對齊的記憶體三者共同決定。 記憶體如何對齊,我以前寫過一篇博文裡講的很詳細。 2:虛擬函式表裡存放的是虛擬函式的記憶體地址,物件呼叫虛擬函式就是通過

讀《深度探索C++物件模型》之物件成員的效率

測試平臺:華碩N53S(五年前的老機子) 編譯環境:VS2010 接下來我將會有多個測試,在多個不同環境下的所消耗的時間比較: 五個測試分別為:個別的區域性變數、區域性陣列、struct之的Public、class 之中的inline Get函式、 class之中的inli

深度探索C++物件模型-第二

建構函式語意學 一 預設ctor的構造操作 在4種情況下,編譯器會為未宣告ctor的類合成一個預設的ctor。 1 帶有預設ctor的成員類物件 如果一個類內含一個或一個以上的成員類物件,那麼類的每一個ctor必須呼叫每一個成員類的預設ctor,編譯

《深度探索C++物件模型》(一)物件模型、儲存形式;預設建構函式一定會構造麼?

歡迎檢視系列部落格: -------------------------------------------------------------------------------------------------------------- 一)、讀後感     在我參

讀書筆記-深入理解JVM虛擬機-1.OOM初探

-a 最大 xms stat new 理解 虛擬機 class 當前 Java堆OOM(Out-Of-Memory)異常 執行例如以下程序,爆出異常 java.lang.OutOfMemoryError: Java heap space /** * VM Ar

深入理解計算機系統》第一學習筆記

文件 傳遞 ati 線性 邏輯 double 動態 內容 起源 信息就是位+上下文 源程序:就是一個由0和1組合的位(bit)序列,8位組成一字(byte),每個字節表示某個文本字符。 系統中所有的信息——包括磁盤文件、存儲器中的程序、存儲器中存放的用戶數據以及網絡上傳送的

《JavaScript高級程序設計》讀書筆記(三)基本概念第一小節

但是 不同的 volatil rom 語法 first 括號 stat -m 內容---語法 本小節---數據類型 本小節 undefined,null,Boolean---流程控制語句---理解函數 任何語言的核心都必然會描述這門語言最基本的工作原理。而描述的內容通常都要