2015-11-02 175 views
3

我有一堆方法返回vector<int>。它們不返回參考或指向vector<int>的指針,因爲返回的值不是類的狀態的一部分,它只是根據方法參數即時生成。避免向量拷貝構造函數

我想避免vector<int>當我調用像這樣的方法時調用拷貝構造函數。

vector<int> result = myClass.GenerateVectorOfInt(/* params */); 

// Do something with the result; 

這樣做的最佳方法是什麼?

這會是一個可以接受的方式嗎?或者還有其他更好或更優雅的解決方案。

vector<int> result = std::move(myClass.GenerateVectorOfInt(/* params */)); 
+1

你有[驗證](http://coliru.stacked-crooked.com/a/4fe331ecaf9498e7)複製構造函數實際上被調用? – chris

+0

未發佈問題。我已經在向量的拷貝構造函數中放置了一個斷點,並且沒有被擊中。 – mk33

回答

6

你不需要做任何特殊的事情,編譯器可以在可行的情況下刪除副本。這稱爲「返回值優化」(RVO)。

即使RVO沒有發生,C++ 11也會迫使vector移動到位,這很便宜,與其大小無關。 (通常這是1個指針和2個整數賦值。)所以矢量絕不會被複製,此舉是最糟糕的情況。


如果出於任何原因RVO不會發生此舉是爲你的用例(可能性很小)太貴了,還有什麼是你可以在不改變功能的簽名做;在呼叫點加入std::move或類似的東西將無濟於事。