出於某種原因,我想返回my :: Vector的對象(這基本上是一個包裝類,內部使用STL向量用於實際存儲,並提供一些額外的功能) 。隨着函數每次在本地創建一個向量,我會按值返回向量。通過C++中的多重函數嵌套值返回向量
my::Vector<int> calcOnCPU()
{
my::Vector<int> v....
return v;
}
現在我可以有函數調用(考慮庫設計)多重嵌套,因此,在短期類似如下:
my::Vector<int> calc()
{
if(...)
return calcOnCPU();
}
據我所知,通過價值迴歸將調用我的::拷貝構造函數Vector類這是一件好事:
Vector<int>::Vector(const Vector& c)
{
....
m_vec = c.m_vec; // where m_vec is std::vector<int>
}
幾個問題: 1)在拷貝構造函數,它被調用的std ::載體的拷貝構造函數?或賦值運算符,只需確認,std :: vector創建深度複製(意味着複製考慮基本整數類型的所有元素)。 2)在Calc()中嵌套calcOnCPU(),每個都返回int的Vector:2或1個Vector的拷貝將被創建?如果這種簡單的方法嵌套,我怎麼能避免多個副本?內聯函數還是存在另一種方式?
UPDATE 1:對我來說很明顯我需要保留我自己的拷貝構造函數,因爲有一些自定義需求。但是,我做了一個簡單的測試,主要功能:
int main() {
...
my::Vector v = calc();
std::cout<<v;
}
我把一些印刷用我的拷貝構造函數「的std :: CERR」時看到它被調用。有趣的是,上面的程序甚至不會調用它(至少不會打印)。是否複製橢圓優化?我在Linux上使用GNU C++編譯器(g ++)v4.6.3。
即將推出的(當前?)C++標準中有「移動語義」。是的,STL向量執行深層複製,這就是你的代碼 – fork0 2012-07-06 12:47:37
[Rvalue引用和移動構造函數](http://en.wikipedia.org/wiki/C%2B%2B11#Rvalue_references_and_move_constructors) – fork0 2012-07-06 12:49:07
如果你試圖擺脫臨時副本,也許你可以讓每個嵌套函數爲你的向量引用一個引用參數,你修改... – 2012-07-06 12:51:04