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

2021-10-25 05:00:28 字數 1089 閱讀 5925

成員們的初始化隊伍

如果有這樣的定義:

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;

temp.x::

x(xx)

;foo

(temp)

;

另一種可能的方式是,拷貝構造的方式,把實際引數構建在其應該在的位置上(棧)。函式返回時,棧上的區域性物件析構函式將會被執行。

x foo()

這種情況下,一種可能的優化方式為:

將函式增加乙個額外引數,型別是x物件的引用。

然後在return指令之前增加乙個拷貝構造的呼叫操作,將要傳回的物件構造出來。

一種可能的優化方式為:

x foo()

在前文中返回值的初始化一節提到的優化方式,有時候被稱為具名返回值(named return value).

如果乙個類中只有最基礎的資料型別,那麼會產生bitwise copy,不需要使用者自定義顯示的拷貝建構函式。

有以下四種成員,必須經由初始化列表初始化:

引用成員

常量基類建構函式擁有引數

成員的建構函式有引數

初始化列表相當於在建構函式之前插入了初始化成員的**。而且是由類中變數宣告的順序來的,不是按照初始化列表中的順序來的。

初始化列表中的順序如果和類中成員的宣告順序不同時,可能會導致問題

如:

class

x}

實際上會先將i的值設定為j, 然後再將j的值設定為val。由於j的初始值是不確定的,因此最終i的值也是不確定的。

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

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

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

乙個類物件所佔空間的大小主要受以下三個因素影響 語言本身的額外負擔,虛繼承,虛函式 編譯器對特殊情況的優化處理 空的 對齊 乙個沒有資料成員的普通物件 沒有虛基類和虛繼承 所占用的空間也不是0個位元組。而是1個位元組,這個是被編譯器安插進去的,為了使這個物件在記憶體中保持獨一無二的位址。然而,當這個...

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

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