右值引用,移動構造,移動賦值

2021-09-28 18:15:29 字數 1366 閱讀 4643

1、目的

右值引用,移動構造和移動賦值是在c++11中引入的,其目的是為了提公升**效率

2、使用場景

類中如果有需要申請動態資源的成員,那麼定義移動建構函式和移動賦值運算子可以避免不必要的拷貝工作,從而提公升**效率。移動構造和移動賦值並不會新開闢資源,而是將源物件的一部分或全部資源移交給了新物件。std::move()的作用是將乙個左值轉換為右值,但它並沒有進行真正的記憶體移動操作。

3、**舉例

class

a std::cout

<(a &&tmpa)

//移動建構函式

std::cout<<

"移動建構函式"

<<

&(vp[0]

)<<

" "

<<

" "

<}

a&operator

=(a &&tmpa)

std::cout<<

"移動賦值"

*this;}

a(const a &tmpa)

//拷貝建構函式

std::cout<<

"拷貝建構函式"

<<

&(vp[0]

)<<

" "

<<

" "

<}private

:int a_;

std::vector<

int> vp;};

intmain()

列印的log如下:

1000000

0x7fec1db5e010

拷貝建構函式0x7fec1d78d010 1000000 1000000

拷貝構造耗時:2.37644ms

0x7fec1db5e010

移動建構函式0x7fec1db5e010 1000000 0

移動構造耗時:0.004215ms

移動賦值

從log上看出拷貝建構函式發生了實際的記憶體拷貝,源物件依舊有效,新物件是在新的記憶體位址上的乙個物件,只是內容與源物件相同。而移動建構函式新物件的vp成員接管了源物件的vp成員的記憶體,沒有發生記憶體複製,從列印的vp[0]的位址可以看出新物件的vp[0]位址與源物件的vp[0]位址相同,說明沒有複製記憶體,但移動構造後源物件中的vp.size()變成了0,說明源物件已經失去了那塊記憶體所有權。

從列印的耗時上看,移動構造要比拷貝構造快很多,這和拷貝的資料量多少有關。

另外,呼叫移動建構函式後,不因該對源物件做任何假設,源物件不能再使用了。

右值引用與移動建構函式 移動賦值

有一陣子沒看c 了,翻開c primer又陌生了一些,想了想引用,於是乎來看了下右值引用。int a 5 int b a 這是左值引用,若我們這樣修改 int a 5 int b a 1 編譯器會報錯 非常量引用的初始值必須為左值。也就是右邊的a 1是常量,常量給非常量引用賦值就報錯。我們可以這樣修...

C 11 右值引用(2)移動構造和移動賦值函式

先參考上一節 c 11 右值引用 1 本節是右值引用的第乙個用途 減少拷貝,減低開銷,提高效率。c 11的右值引用概念出來後,c 類的預設函式多了兩個,移動構造和移動賦值函式。之前的所有預設函式為 構造 析構 拷貝構造 拷貝賦值 取址 取址const 下面是乙個簡單例子。class mystring...

C 右值引用與移動構造

c 中提供了兩種引用方式。左值引用與右值引用。其中右值引用是c 11的新標準新增的內容。所謂的右值引用就是必須繫結到右值的引用。在介紹之前,先說明一下c 中的左值和右值的規定。實際上,最早在c語言中就有了左值和右值之分。最初的左值即指在賦值號左邊的變數,右值指在賦值號右邊的變數。隨著c語言的發展和c...