複製建構函式的操作
像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 非靜態成員函式並非某個物件獨有,記憶體中僅存在乙份資料 乙份函式例項 不同物件的某個非靜態成員...