《深度探索c 記憶體模型》讀書筆記 (五)

2021-10-25 06:45:27 字數 1040 閱讀 8556

乙個類物件所佔空間的大小主要受以下三個因素影響:

語言本身的額外負擔,(虛繼承,虛函式)

編譯器對特殊情況的優化處理(空的)對齊

乙個沒有資料成員的普通物件(沒有虛基類和虛繼承),所占用的空間也不是0個位元組。而是1個位元組,這個是被編譯器安插進去的,為了使這個物件在記憶體中保持獨一無二的位址。然而,當這個類是乙個類的父類時,

資料成員本身的分析,直到整個class宣告了才會開始。

而函式引數列表的分析,是從函式宣告時就已經開始了。

using namespace std;

typedef int length;

extern length value;

class point3d

auto getvalue()

private:

typedef float length;

length value;

};

非靜態成員在物件中的排列順序與宣告順序一致。

多個access section中的資料成員自由排列,不必按照在class中宣告的順序來。

class a;

a.x // 這樣的資料成員訪問成本有多少?

不會有任何時間或者空間上的額外負擔,因為放在資料段data segment。

並且,不管是不是虛繼承,多重繼承,因為就在資料段中有唯一乙份例項。

函式中,關於對成員變數的訪問,實際上都是由乙個隱含的類物件完成的(this 指標)。

如:

class a 

};

最終轉變為 this + (&point3d::x - 1)。

指向資料成員的指標,offset總是會被加上1。

可以讓編譯系統區分出指向資料成員的指標還是沒有指向任何資料的兩種情況???

非靜態資料的偏移值在編譯期就能決定,即使這個成員是屬於基類物件(單繼承或者多重繼承)效率也是一樣。

如果包含虛繼承,情況稍微有些不同。比不包含虛繼承的物件中的成員訪問速度稍低。

《深度探索c 記憶體模型》讀書筆記 (二)

總結c 編譯器會在人意想不到的地方做一些隱式操作。例如,只含有乙個引數的建構函式,會被當做型別轉換運算子。而關鍵字explict就是為了阻止這一機制。c 編譯器會在需要的時候自動生成預設建構函式。如果乙個類沒有任何的建構函式,但是它有乙個物件成員,這個物件成員有乙個預設建構函式。那麼編譯器將會為這個...

《深度探索c 記憶體模型》讀書筆記 (四)

成員們的初始化隊伍 如果有這樣的定義 x x0 x x1 x0 x x2 x0 x x3 x x0 都將會導致x的拷貝建構函式被呼叫。如果函式定義如下 void foo x x0 x xx foo xx x那麼呼叫foo函式時,將會呼叫x類的拷貝建構函式,生成乙個臨時物件,如下 x temp tem...

《深度探索C 物件模型》讀書筆記(5)

純虛函式 在設計抽象基類時,需要注意以下幾點 1 不要將destructor宣告為pure virtual function 如果將destructor宣告為pure virtual function,則設計者一定得定義它。因為每乙個derived class destructor會被編譯器加以擴充...