簡體   English   中英

向量返回時移動語義行為

[英]move semantics behaviour on vector return

我一直在玩c ++ 11 move語義

在代碼中...

#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”的移動構造函數,(我假設這是向量重新分配的位置),然后調用“為什么”移動構造函數。

這一切都符合預期,但是我期望在GetNewVector()的末尾返回矢量時再次移動對象,但是不會再次調用move構造函數。 我的猜測是RVO正在發生,但是當我在調試模式下運行Visual Studio(2k10)時,我不確定是否會發生這種情況?

的確,如果可以執行RVO,那么它將優先於使用move構造函數?

如果指定將它們按元素方向移動,則在容器上移動的優點將被嚴重削弱。

取而代之的是,它們僅使用其他內部內容,即在std::vector情況下指向動態分配數組的指針,從而將元素保留在原處,從而使此操作成為恆定的復雜性操作。 如果您進行了按元素的移動,那么您將需要進行線性復雜度運算。

的確,如果可以執行RVO,那么它將優先於使用move構造函數?

該標准在這方面受到了一些限制,但是可以,RVO(通常為復制刪除,也包括與名稱相反的動作)將優先於其他任何東西,因為它更快。 :)

請注意,僅在可以執行復制刪除的情況下才執行自動移動,而並非出於任何原因。 有關自動移動的更詳細的信息,另請參見此問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM