C 物件模型解析三

2021-08-07 19:37:17 字數 1327 閱讀 3720

複製建構函式的操作

像default constructor一樣 如果乙個class沒有宣告乙個複製建構函式,就會有隱式的宣告出現。跟之前一樣,c++標準會把複製建構函式分為有用的以及無用的,只有有用的例項才會被合成到程式之中,決定乙個copy constructor是否是trivial的標準在於class是展現出所謂的bitwise copy semantics。

bitwise copy sematics

以一段**展示:

class word

private:

int cnt;

char *str;

}

這種宣告展現了bitwise copy semantics(逐為拷貝),這時類的初始化並不需要以函式呼叫完成,只需要按位拷貝。

不是bitwise copy sematics

根預設建構函式類似分四種情況:

1.當class內含乙個class object而後者宣告有乙個複製建構函式時(編譯器有義務呼叫其複製建構函式),就會生成乙個non-trivial 複製建構函式。

2.當class繼承自乙個base class而後者存在乙個複製建構函式時,編譯器有義務呼叫基類的複製建構函式。

3.當class宣告乙個或多個virtual functions時。

4.當class派生自乙個繼承串鏈,其中有乙個或多個virtual base classes.

前兩種情況,編譯器必須將member或base class的copy constructors呼叫操作安插到合成的複製建構函式中。後面兩種情況相對複雜:

有虛函式的時候重新設定vptr

這種情況如果是以派生類初始化基類,必須沖洗設定vptr指向基類的虛表。

處理virtual base class subject

虛基類的存在需要特殊處理。乙個類物件如果以另乙個物件作為初值,而後者有乙個虛基類子部分,那麼bitwise copy semantics就會失效。編譯器需要合成乙個複製建構函式,安插一些**設定虛基類指標或偏移,對每乙個members執行必要的memberwise初始化,以及執行其他的記憶體相關操作。

編譯器呼叫複製建構函式的策略以及這些策略如何影響我們的程式

編譯器優化操作nrv:

以一段**來展示:

x bar()

//經過nrv優化之後:

void bar(x &__result)

C 物件模型解析二

編譯器對於物件構造過程的干涉,以及對於程式形式和程式效率的衝擊 對於乙個class x,如果沒有任何user declared constructor,那麼會有乙個預設的constructor被隱式的宣告出來.乙個被隱式宣告出來的建構函式是乙個trivial constructor 無用的const...

C 物件模型(三)

多重繼承的資料成員布局 這裡解釋了這樣的問題 當乙個類從多個類繼承時,並且這些類可能從其他類中繼承的情況下,類的資料結構如何布局?答案是,先將基類的成員依次排列,最後放本類的資料成員。問題是有多個基類,這些基類的順序是怎樣的呢?c 標準並沒有定義。但是一般來說,編譯器會把先定義的基類的資料成員放在前...

C 類和物件(三) C 物件模型和this指標

c 中,類的成員變數和成員函式分開儲存。只有非靜態成員變數屬於類的物件,占用物件的記憶體空間。注1 非靜態成員函式和靜態成員 包括靜態成員變數與靜態成員函式 均不屬於類的物件,不占用物件的記憶體空間。注2 非靜態成員函式並非某個物件獨有,記憶體中僅存在乙份資料 乙份函式例項 不同物件的某個非靜態成員...