可能重複:
What happens if I return literal instead of declared std::string?理解C++ 11個右值,移動語義和性能
考慮下面的代碼
1| string getName() {
2| return "meme";
3| }
4|
5| string name = getName();
函數getName()返回一個臨時對象。在C++ 03中,我明白「string」的拷貝構造函數被調用並且臨時對象被銷燬。實際上,編譯器(至少在gcc 4.7中)通過不創建對象「name」而是用臨時對象本身替換它並且不銷燬臨時對象(我嘗試了MyVector類;而不是std :: string)來優化第5行。
按照C++ 11標準中的定義,
1.是getName()返回一個右值嗎?
2.在上面第5行中,哪個字符串的構造函數被調用(移動或複製)?我是否應該爲移動構造函數調用std :: move()來調用?
3.使用移動語義,效率比編譯器提供的「copy elision」優化效率低嗎?
這將是_copy elision _... –
@ K-ballo感謝您的啓發。 –
添加行號看起來很棒!從來沒有見過之前=) – qwertz