[英]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.