移動構造函數形象解釋

std::move

std::move() 並不會真正的移動對象真正移動對象的是移動構造函數,移動複製函數等的完成
std::move()只是將參數轉換成右值罷了(可以理解爲進行了static_cast操作)

這塊代碼會被移動嗎

std::stting str = "test";
string && r = std::move(str);
std::string t(r);

答案是不會的爲什麼呢
因爲c++11內部的形參,即使它被聲明爲右值引用類型,並被綁定到一個右值引用類型的實參(綁定就是傳參)他也無法觸發移動函數除非你在次使用move函數或者forward函數;
正確答案如下

std::string t(std::move(r));

移動在內存或者寄存器中的操作是什麼,一定比拷貝賦值性能高嗎

答案是不一定比拷貝快,平時c++拷貝就是吧原始的內容賦值一遍在清除原始數據打個形象的比喻,你現在有個滿滿的硬盤要送給你的朋友,c++之前的做法是我買一個新的硬盤給你,把新硬盤賦值好數據一塊塊拷貝給他,然後在把你的硬盤給毀掉,這塊你們發現其實是不是很笨的做法。
其實想想你的硬盤都要銷燬了那幹嘛不直接送給你朋友得了是把,還要買新硬盤,拷貝數據,毀掉自己的硬盤數據,你說無聊不無聊,所以總結下其實移動函數其實就是轉移所有權,在對象方面其實就是轉移指針地址所以爲什麼快我想聰明的你也肯定知道了吧~
但是一定所有的數據都快嗎,其實不是的,對於基礎類型,或者那種沒有new出空間的類型,沒有指針這個概念,所以其實移動和拷貝賦值是等同的,沒有快也沒有滿
對於棧上的數據,move是沒有意義的,,堆上的東西送來送去沒啥問題,棧上的東西可送不得,畢竟出作用域就銷燬了

在畫個圖形象說下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章