深度探索C 物件模型 2 3 程式轉化語意學

2022-05-08 17:48:12 字數 1915 閱讀 8783

一、 

1、顯示的初始化操作

x x0;

void foo_bar()

會被轉換成如下步驟(雙階段轉化):

1

void

foo_bar()

2

view code

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()

//會被以下替代:

x bar(x&_result)

注:當class缺少copy constructor時,編譯器將不能做nrv優化(原因不知)

3、nrv優化確實得到了效率上的改善,但是卻飽受批評,原因如下:

①:使用者無法得知nrv是否真的完成。

②:一旦函式變得十分複雜,nrv將難以施行。當所有的named return指令語句發生於函式的top level,優化才施行。

4、copy constructor可能會被征以效率稅,例如下面的**:

x xx0(1024

);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();

三、copy建構函式中使用memcpy()和memset()是效率最高的方式,但是當class內含有virtual functions或內含乙個virtual base class時,上述**將難以正確執行,因為編譯器會新增一些**,所以這種情況下,掌握某些c++ object model的語意學知識是非常重要的!

深度探索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 驅動物件模...