0%

C++ return secret

之前實驗出來的結果,做個筆記,以免日後忘記。

由於現在的C++編譯器都會做某種程度的最佳化,以GCC來當範本,加上-fno-elide-constructors 參數避免Copy elision

以下是我們的程式碼。

而第一版的執行結果如下

1
2
3
4
5
6
7
Constructing! 1
Copy constructing! 2
Destructing.. 1
Copy constructing! 3
Destructing.. 2
before return
Destructing.. 3

從結果我們可以發現,get函數裡面的f,就是id為1的物件,而這個物件在函數結束之後就結束生命週期。而id為2的物件就是get回傳的暫時物件。當回傳時會複製f的內容,而生命週期在main中的foo f = get();之後也跟著消失,從這邊可以看到,我們產生了一個物件,複製了兩份物件,如果當物件體積大的時候,大量的複製/銷燬這種損失是巨大的。

接著介紹
Returning temporary object and binding to const reference
第二版的程式碼

來看執行結果

1
2
3
4
5
Constructing! 1
Copy constructing! 2
Destructing.. 1
before return
Destructing.. 2

看到少了一個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的生命週期一樣長,無需再複製一份。