關於c 的 右值 右值引用 move

2021-10-02 00:08:40 字數 1477 閱讀 4969

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

int i = 5;

string s1(「ppap」);

都可以完成取位址的操作的操作 &i,&si;

那麼定義乙個左值引用,就是給這些位址起乙個其他的名字罷了,位址是不會發生變化的,也就是說左值引用的本質其實還是指標:

int &k = i;

string & s2 = s1;

右值就不一樣了,右值是乙個即將消亡的值,那麼怎麼算即將消亡?就是沒有人記得他了:

string (「ppap」);

這樣乙個語句的的確確在這個函式棧中構造了這麼乙個空間,只不過可惜的是他是沒有名字的!如果我在這個語句段中執行賦值或者拷貝,那麼他起到了臨時變數的作用:

string s1 = string(「ppap」);

但是一旦離開這一段語句,我就再也找不到這段空間的位址了,也就是一定意義上的消亡,但是這個消亡指的是沒有人記得他了,它自身真正的消失是發生在函式棧清除;

那麼理解了右值就可以說明什麼是右值引用了。右值引用的含義就是,我想記下這個臨時的,快要消亡的,馬上就沒得人記得他的名字(位址)。

那麼換句話說:

const int & i = 1;

int && i = 1;

其實在某些意義上是等價的(不是完全等價)

關於右值引用的意義,我的理解是:告訴編譯器,這個變數我不要了,在執行賦值、拷貝構造等操作的時候,呼叫我提供的移動建構函式!

而move的底層其實就是乙個靜態強制轉換,無論你是什麼型別,一律變成右值引用型別,去強制匹配提供的右值引用形參的函式(用於實現接管資源)。

綜上所述,右值引用在我看來有兩種作用:

1:獲取乙個匿名臨時變數的位址。

2:通過move強制轉換告訴編譯器,這個變數我不需要了,請幫我呼叫形參為右值引用的函式,來接管這份資源。

下面給乙個例子在這裡插入**片

class str 

//建構函式

str(const char* p)

str(const str& p)

str& operator = (const str & p)

str(str&& p)

~str()

private:

char * data;

int len;

};ostream& operator<

int main()

結果為:

右值引用 move函式

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

c 右值引用,左值引用與move

參考一篇不錯的博文 核心思想 臨時物件被使用完之後會被立即析構,在析構函式中free掉申請的記憶體資源。如果能夠直接使用臨時物件已經申請的資源,並在其析構函式中取消對資源的釋放,這樣既能節省資源,又能節省資源申請和釋放的時間。這正是定義移動語義的目的。簡單來說,類的建構函式 使用左值引用的建構函式 ...

右值引用和move語義

標籤 c 11 c lvalue rvalue 2013 10 04 20 49 2909人閱讀收藏 舉報 c 6 目錄 lvalue 具有儲存性質的物件,即lvalue物件,是指要實際占用記憶體空間 有記憶體位址的那些實體物件,例如 變數 variables 函式 函式指標等。rvalue 相比較...