一、
1、顯示的初始化操作:
x x0;會被轉換成如下步驟(雙階段轉化):void foo_bar()
1view codevoid
foo_bar()
2
2、引數(形參)的初始化:
1另一種方法是:以「拷貝建構」的方式把實際引數直接健在其應該的位置上。void foo(x x0);//宣告2
3x xx;
4foo(xx);5//
會被轉換成實際如下:
6 voif foo(x&x0);78
x _temp0;
9_temp0.x::x(xx);
10 foo(_temp0);
3、返回值的初始化:
已知下面這個函式定義:
x bar()那麼該函式是如何把返回值返回的呢?實際上是個雙轉換過程:
①:首先加乙個額外引數,型別是class object的乙個reference。
②在return語句之前安插乙個copy constructor呼叫操作,以便將欲返回之object的內容做上述新增引數的初值。
以下是上述函式的轉換後的**:
void bar(x& _result)二、我們已知上面的轉換過程,那麼如何改善會使效率得到提公升呢?
1、在使用者層面做優化:
以下是以往**的風格
x bar(const t& y, const t& z)將會被以下風格所替代:
x bar(const t& y, const t& z)雖然通過上述方式省略了copy constructor,但是會使特殊用途的constructor大量擴散。
2、在編譯器層面做優化:
採用所謂的named return value(nrv)優化,以下是nrv優化的過程:
x bar()注:當class缺少copy constructor時,編譯器將不能做nrv優化(原因不知)。//會被以下替代:
x bar(x&_result)
3、nrv優化確實得到了效率上的改善,但是卻飽受批評,原因如下:
①:使用者無法得知nrv是否真的完成。
②:一旦函式變得十分複雜,nrv將難以施行。當所有的named return指令語句發生於函式的top level,優化才施行。
4、copy constructor可能會被征以效率稅,例如下面的**:
x xx0(1024三、copy建構函式中使用memcpy()和memset()是效率最高的方式,但是當class內含有virtual functions或內含乙個virtual base class時,上述**將難以正確執行,因為編譯器會新增一些**,所以這種情況下,掌握某些c++ object model的語意學知識是非常重要的!);x xx1 = x(1014
);x xx2 = (x)1014;//
xx0的實際過程
xx0.x::x(1024
);//
xx1和xx2的實際過程
x _temp0;
_temp0.x::x(
1024
);xx.x::x(_temp0);
_temp0.x::~x();
深度探索C 物件模型
傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷 譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你...
深度探索C 物件模型
傳世經典書叢 深度探索c 物件模型 美 stanley b.lippman 斯坦利 b.李普曼 著 侯捷譯 isbn978 7 121 14952 8 2012年1月出版 定價 69.00元 16開 356頁 宣傳語 如果你是一位c 程式設計師,渴望對於底層知識獲得乙個完整的了解,那麼本書正適合你 ...
深度探索C 物件模型
深度探索c 物件模型 本書目錄結構如下 第1章 關於物件 object lessons 加上封裝後的布局成本 layout costs for adding encapsulation 1.1 c 模式模式 the c object model 簡單物件模型 a object model 驅動物件模...