之前實驗出來的結果,做個筆記,以免日後忘記。
由於現在的C++編譯器都會做某種程度的最佳化,以GCC來當範本,加上-fno-elide-constructors 參數避免Copy elision。
以下是我們的程式碼。
而第一版的執行結果如下
1 | Constructing! 1 |
從結果我們可以發現,get函數裡面的f,就是id為1的物件,而這個物件在函數結束之後就結束生命週期。而id為2的物件就是get回傳的暫時物件。當回傳時會複製f的內容,而生命週期在main中的foo f = get();之後也跟著消失,從這邊可以看到,我們產生了一個物件,複製了兩份物件,如果當物件體積大的時候,大量的複製/銷燬這種損失是巨大的。
接著介紹
Returning temporary object and binding to const reference
第二版的程式碼
來看執行結果
1 | Constructing! 1 |
看到少了一個Object生成,這是由於C++ Standards Temporary objects 中有這麼一段話。
A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits.
所以這個暫時物件的生命週期就跟main的生命週期一樣長,無需再複製一份。