2015-08-14 67 views
0

閱讀一些職位上的SO後,如果我理解正確的值返回一個std :: vector的是在初始化OK,沒有多餘的副本將被製作如果我這樣做來自返回值函數的結構成員賦值的額外副本?

std::vector<double> fun() 
{ 
    std::vector<double> v; 
    ... 
    return v; 
} 

std::vector<double> a = fun(); 

這就是我目前這樣做,但對於「可讀性」我的代碼的原因,我想寧願在結構向量:

struct MyStruc 
{ 
    std::vector<double> v; 
    ... 
}; 

如果我做

MyStruc A; 
A.v = fun(); 

我會是否昂貴?通常我不會在意這一點,但在這裏我知道我的矢量v最終會很大,比如1億個元素。所以我想知道這裏會發生什麼。據我瞭解,由於這是一項任務,因此將不存在副本刪除,但這一舉措(對我來說不是很清楚)呢?在那種情況下,我該如何避免它?謝謝。

+2

我不認爲'A.v = fun();'符合copy elision的條件,因爲它是一個賦值操作符。 (編譯器仍然可以在as-if規則下優化它,儘管我不知道是否有編譯器會這樣做)。但是,'MyStruc A = {func()};'可能符合複製elision的條件。 –

+0

是的,我知道,但我想我的問題並不清楚。我想知道他們是否是另一個便宜的解決方案,因爲作業不包含複製elision。 – Castou

回答

3

本聲明:

A.v = fun(); 

是賦值,而不是和初始化,所以不是RVO候選人 - 和賦值操作符必須被調用。但是,如果您使用的是C++ 11或更高版本,則std::vector有一個移動賦值運算符,在此情況下將使用該運算符賦值運算符,因此它並不是非常昂貴 - 矢量的內存將從對MyStruct字段未命名的臨時文件,而不必重新分配或複製大部分數據。

+0

我使用C++ 11是的。所以如果我理解正確的話,這個舉動就像複製指針一樣。謝謝你的回答,我會安心完成任務,然後我更願意清楚代碼而不是試圖找到最便宜的解決方案。 – Castou