假設編譯器中沒有返回值優化。
在C++中,當函數中的對象return-by-vaule時,真正的步驟在下面,我正確嗎?完全,第三次調用構造函數。按值返回是否調用複製構造函數或複製賦值運算符?
本地(正常constuctor) - >溫度(拷貝構造函數)--->外(拷貝構造函數或複製assignemt運營商)
- 創建一個本地的對象,在這裏它調用正常的構造函數;
- 使用本地對象創建一個臨時對象,在這裏它調用複製構造函數;
- 分配臨時對象實物以外(一),在這裏它調用拷貝構造函數(情形),或者拷貝賦值運算符(情形2)
class Name{...};
Name func(){
// ...
Name local;
return local;
}
案例1:
Name outside = func(); // call copy constructor?
case2:
Name outside;
outside = func(); // call copy assignment operator?
如果我在第一部分是正確的,那麼如果啓用了返回值optimizaiton?
我建議你用一些輸出語句編寫一個快速程序並查看。這似乎取決於所涉及的變量以及編譯器將作爲優化的一部分作出的決定。例如,在某些情況下,可能會採取行動而不是複製或建設。 –
@ M.M是的,正確的。 – Edison
請注意,RVO並不是常規意義上的優化,這種做法可以更快地完成相同的任務,而是在語義上成爲語言的一部分。編譯器可以不運行復制/移動構造函數,即使它們有副作用,所以輸出可能會有所不同。 – sp2danny