我一直用C++ 11個移動語義移動語義行爲
在代碼中打轉轉......
#include <vector>
#include <string>
std::vector<std::string> GetNewVector()
{
std::vector<std::string> newVec;
newVec.push_back(std::string("hello")); //(1)
newVec.push_back(std::string("whey")); //(2)
return newVec;
}
int main(int argc, char* argv[])
{
std::vector<std::string> vec = GetNewVector();
}
在點(1)移動構造函數「 hello「對象在對象移入向量時調用。
在點(2)首先再次調用「hello」的移動構造函數(我假設這是vector重新分配的位置),然後調用「whey」移動構造函數。
這一切都如預期的那樣,但是我期待在GetNewVector()
結束時返回矢量時再次移動對象,但移動構造函數不會再被調用。我的猜測是,RVO正在發生,但我在調試模式下運行Visual Studio(2k10)我不確定這是否會發生?
是不是真的,如果RVO可以執行,那麼它將優先於使用移動構造函數嗎?
這是什麼語言? TString(CERN ROOT?)std :: vector無指定類型? –
你有什麼是邏輯上的副本,而不是一個動作。爲了做到這一點,你必須做'返回std :: move(newVec)'。 –
@VaughnCato:壞壞!在這裏使用'std :: move'會抑制RVO,並且標準已經說過,編譯器首先必須嘗試移動'newVec',並且只有在失敗時才複製它。 – Xeo