右值是相對於左值而言的。簡單來說,在等號左邊的叫做左值,等號右邊的叫做右值。再具體點說,左值是值能夠取位址的值,比如我們定義的變數這些都是能夠賦值並且能夠取位址的。而右值是不能夠取位址的,比如常量「hello",或者乙個臨時變數。在c++11之前我們如何實用右值呢?通常是使用常引用,const type & 來繫結右值。
當我們知道了是麼是右值的話,那麼怎麼表示呢,左值引用是&,那麼右值是&&。
假如我有兩個物件1,2。現在需要使用物件1來給物件2賦值,那麼我們可能會使用拷貝建構函式或者賦值運算子的過載。這裡邊會將物件1的資源拷貝乙份給物件2,這裡就有個資源的浪費問題了,有時候我們只希望,將物件1的資源轉移給物件2,因為之後不會在使用物件1了。這時候資源重用物件1的就行,不想再建立並拷貝,增加額外開銷。於是移動建構函式就出來了。
class a
~a()
} a(const a & opobj)
size = opobj.size;
p = new char[size];
memcpy(opobj.p,p,size*sizeof(char));
}a & operator = (const a & opobj)
size = opobj.size;
p = new char[size];
memcpy(opobj.p,p,size*sizeof(char));
return *this;
}//下面是移動建構函式,作用是將物件的資源交接過來。
a(a && opobj)
size = opobj.size;
p = opobj.p;
opobj.p = nullptr;
opobj.size = 0;
}char * p;
int size;
};那麼移動建構函式什麼時候會發生呼叫呢?
在下面:
int main()
當有時我們不僅僅是需要將臨時物件的資源轉移過來,也希望將普通常量的物件轉移過來,這時候怎麼觸發移動語義呢?
在標準庫中unility中提供了乙個函式叫做move。但是不要被這個move單詞騙了,它只是把左值轉換成右值而已。
int main()
不僅只有這個,algorithm 中提供了也提供了用於容器元素的move函式。
c 11 移動語義
c 已經擁有了拷貝建構函式,和賦值函式,它們主要定位為淺和深度拷貝,新增加乙個移動建構函式,主要避免拷貝構造。在定義了移動建構函式的情況下,在實參 argument 是乙個右值 rvalue,包括xvalue和prvalue 的情況下會呼叫移動建構函式,而不是呼叫複製建構函式 可以使用std mov...
移動語義和右值引用(C 11)
左值 可以取位址 有名字的 右值 不能取位址 沒名字的 傳統的c 引用稱為左值引用,使得標誌符關聯到左值。c 11新增了右值引用,使用 表示。引入右值引用的主要目的之一是實現移動語義。在複製物件時,實現物件的移動而非拷貝。通過移動建構函式 移動賦值運算子實現 函式的引數為右值引用,函式內部並非深度複...
C 11 右值引用和移動語義
因為工作室要求寫技術部落格記錄學習到的知識點,自己之前是沒有寫過部落格的,所以現在用一篇介紹右值引用和移動語義的部落格作為部落格的第一篇,可能對於移動語義的理解還不夠深刻,但可以作為乙個簡單的介紹部落格 要理解好右值引用首先要知道什麼是左值?什麼是右值?1.左值是表示式結束後依然存在的持久化物件 2...