1. 程式人生 > 其它 >第六章:臨時性物件

第六章:臨時性物件

  1.是否會產生一個臨時物件,視編譯器的進取性和程式碼操作發生時的語境而定。C++標準中指出編譯器對臨時性物件有完全的自由度。

  2.在新開闢的記憶體上以拷貝的方式構造物件時,幾乎所有編譯器都不會產生一個臨時性物件。

T c=a+b;
//其中加法運算子形式如下:
    T operator+(const T&,const T&);
//
    T T::operator+(const T &);

  上面的表示式可能會通過拷貝建構函式直接將a+b的值放到c中,同時可能會有NRV發生,不會呼叫建構函式和解構函式。然而下面這種情況幾乎確定會產生臨時物件。

c=a+b;
//會被轉換為如下偽碼① T temp; temp.operator+(a,b); c.operator=(temp); temp.T::~T(); //而不會轉換為這樣② c.T::~T(); c.T::T(a+b);

  這種情況下,不像之前那種情況,不能直接傳遞c到運算子函式中,因為c的記憶體不是一塊新鮮的地址,需要先將其進行清理。而不選則②的原因是,拷貝建構函式、解構函式和拷貝賦值運算子都是可以由使用者提供的,這可能導致①和②的語義不同,所以編譯器會選擇與最初表示式語義最符合的情況①。

  3.臨時物件的生存週期

  ①臨時物件被摧毀應該是對創造該臨時物件的完整表示式求值過程中的最後一個步驟。但是會有②和③兩個特例

  ②凡是持有表示式執行結果的臨時物件,應該留存到物件的初始化操作完成為止。

  ③如果一個臨時物件被繫結與一個引用或指標,知道被初始化的引用的生命結束,或直到臨時物件的生命範疇結束,視哪一種情況先到達而定。

  4.C++標準沒有規定臨時物件儲存的位置,但是根據上面臨時物件的週期來看,大多數是儲存在程式碼區即棧。

  5.臨時物件的產生可能導致大量的記憶體存取過程,編譯器可以通過反聚合(把複雜的式子標稱很多簡單的式子相加)來提高效率。