c 右值以及move

2022-05-03 21:48:11 字數 1013 閱讀 5477

之前對move一直存在誤解,想得太萬能了。

右值實際上就是臨時記憶體,類似於(1+2),可以int &&number = 1+2; 

move的話是將引數變成自身型別的右值,然後賦值給其他變數。

我一開始以為move是交換兩塊記憶體的指標之類,複雜度是o(1)那種,後來測試了一下發現並不是這樣。測試**如下:

#include #include 

#include

#include

#include

using

namespace

std;

uint64_t getcurrenttime()

struct

node ;

inline

void testmove(node *node1, node *node2)

inline

void testcopy(node *node1, node *node2)

intmain()

cout

<

for (int i = 0; i < str2len; i++)

cout

<

#endif

return0;

}

view code

發現直接copy和move並沒有什麼區別。

實際上,move的最大用法應該是用於移動建構函式。

對於某些帶了指標型別的類,在複製其物件時,一般要使用深拷貝,參考string。

string內建乙個char *指標,當你拷貝了當前string物件時,你不應該只複製指標,而應該要新開一塊記憶體,把原指標指向的記憶體複製過去。

但是有一種情況例外,如果我可以保證原物件不用了的話,那我就可以執行淺拷貝,直接把指標的值複製過去,這樣可以省去複製指標指向記憶體的開銷。

以string為例子,深拷貝是複製char *指向的記憶體,而淺拷貝直接複製指標。

move的作用只是把引數變成右值,然後觸發移動建構函式,或者移動賦值函式,僅此而已。

C 11右值 右值引用以及move語義

1 字面常量 1 3,2 等 2 臨時物件 返回非引用型別的函式,算術 關係 位以及後置遞增 遞減原算符 注意 左值引用的函式,賦值 下標 解引用和前置遞增 遞減運算子返回都為左值 3 無名物件 4 一般函式的返回值也為右值 class myclass myclass 右值 1 右值引用只能繫結到臨...

關於c 的 右值 右值引用 move

第一次接觸c move操作就懵逼了,一直想探個究竟,但是右值以及右值引用思考了好長時間,就是不得要領,今天終於有所收穫,寫下第一篇部落格,一方面為了幫助一些剛入門的朋友,另一方面也是幫助自己今後複習。左值是乙個持久的量,右值是乙個短暫的量。那怎麼算持久怎麼算短暫呢?取決於我的 裡有沒有乙個變數來儲存...

右值引用 move函式

為了支援移動操作,新標準引入了一種新的引用型別 右值引用 rvalue reference 所謂右值引用就是必須繫結到右值的引用。我們通過 而不是 來獲得右值引用,右值引用有乙個重要的性質 只能繫結到乙個將要銷毀的物件。因此,我們可以自由地將乙個右值引用的資源 移動 到另乙個物件中。一般而言,乙個左...