c++ 在布局以及訪問時間上的額外開銷是由virtual
引起:
a. virtual function 機制
b. virtual base class
class point ;
該函式宣告包含:
3種 class member functions: static、nonstatic 和 virtual
2種 class data members: static 和 nonstatic
c++物件模型
1. c++中的虛函式是通過虛函式表(vtbl)來實現.
2. 每乙個類物件會被安插乙個指標(vptr),指向該類的虛函式表。
3. vptr的設定和重置都由每乙個類的建構函式、析構函式和複製賦值運算子自動完成。
class iostream:
public istream,
public ostream {};
class istream : virtual public ios{};
class ostream : virtual public ios{};
暫略
c++中凡處於同乙個access section(public, protected, private)的資料,必定保證以其宣告順序出現在記憶體布局中。
然而被放置在多個access sections 中的各資料,排列順序就不一定了
c struct 在c++中的乙個合理用途,是當你要傳遞「乙個複雜的class object 的全部或部分」到某個c函式去時,
struct宣告可以將資料封裝起來,並保證擁有與c相容的空間布局。然而這項保證只在組合的情況下才存在
``需要多少記憶體才能表現乙個class object
1. nonstatic data members 的總和
2. 因alignment的需求而填補(padding)上去的空間
3. 因支援virtual而由內部產生的任何額外負擔
zooanimal *px;
int *ptr;
vector* ptr;
三個指標的不同之處在於其定址出來的object型別不同。
也就說「指標型別」會教導編譯器如何解釋某個特定位址中的記憶體內容及其大小
轉換是一種編譯器指令。一般不改變乙個指標所含的真正位址,它只影響 「被指出之記憶體的大小和其內容的解釋方式」
加上多型之後:
class zooanimal;
class bear : public zooanimal ;
dances dances-known;
int cell_block;
};
記憶體布局
bear b;
zooanimal za = b;
za.rotate();
為什麼rotate()所呼叫的是zooanimal例項而不是bear ?
編譯器確保如果某個object含有乙個及以上的vptrs,那些vptrs的內容不會被base class object 初始化或改變
p34 : 如果virtual funtion 被定義為inline,則更有效率上的收穫 ??
virtual function 是在執行期間確定的,inline function 在編譯期被確定, 兩者不是衝突嗎
深入探索C 物件模型
深入探索c 物件模型 本書目錄結構如下 第1章 關於物件 object lessons 加上封裝後的布局成本 layout costs for adding encapsulation 1.1 c 模式模式 the c object model 簡單物件模型 a object model 驅動物件模...
深入探索C 物件模型之物件
物件 一 在c語言中,資料 和 對資料的處理 函式 分開宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的關聯性。例如,typedef struct point3dpoint3d 而在c 中,座標型別和座標數目都可以引數化 template class point type operator ...
深入探索C 物件模型(6)
物件陣列的構造 物件資料的構造一般有兩種方式 靜態和動態 1 靜態分配 以string類為例,string a 10 就是以靜態形式構造資料,這樣的陣列的個數是確定的不能修改的。像這樣的陣列怎麼進行構造和析構呢?編譯器在構造陣列的時候會生成乙個使用預設建構函式的陣列建構函式arr new char ...