如何正確地將以下Java代碼轉換爲C++?從函數發回一個向量
Vector v;
v = getLargeVector();
...
Vector getLargeVector() {
Vector v2 = new Vector();
// fill v2
return v2;
}
所以這裏v
是一個參考。該函數創建一個新的Vector對象並返回對其的引用。很好,很乾淨。
然而,讓我們來看看下面的C++鏡面翻譯:
vector<int> v;
v = getLargeVector();
...
vector<int> getLargeVector() {
vector<int> v2;
// fill v2
return v2;
}
現在v
是一個矢量對象,如果我理解正確的話,v = getLargeVector()
將拷貝函數返回全部由矢量元素到v
,這可能是昂貴的。此外,v2
在堆棧上創建並返回它將導致另一個副本(但我知道現代編譯器可以優化它)。
目前,這是我做的:
vector<int> v;
getLargeVector(v);
...
void getLargeVector(vector<int>& vec) {
// fill vec
}
但我並不覺得一個完美的解決方案。
所以我的問題是:做什麼是最佳做法(通過避免不必要的複製操作)?如果可能的話,我想避免常規指針。我從未使用過智能指針,我不知道他們是否可以在這裏幫忙。
由於經常NRVO這不是最現代的編譯器有問題...請參見本:http://www.efnetcpp.org/wiki/Return_value_optimization – 2010-01-08 03:39:49