1. 程式人生 > >C++右值引用和移動語義淺說

C++右值引用和移動語義淺說

1、神馬叫右值和右值引用

C++中所有的值分兩種,一種叫左值(可以取地址,有名字的),一種叫右值(不可以取地址,沒有名字的)。

常見的如 int a  = b+c ;表示式中a  可以取地址為左值,(b+c)不可以取地址為右值。

其中,右值又分為純右值和將亡值。

純右值如表示式產生或函式返回值產生的臨時變數、還有一些常量,如1,2,3,“abc”,這些都是右值,無法取地址,雖然佔有棧的記憶體空間和常量區卻沒有名字。

將亡值,這是C++11新增的跟移動語義有關的表示式。如右值引用T&&的函式返回值,std::move()的返回值等。記著將亡值是和移動語義相關的,通常將要被移動的物件(移為他用)即可。

非常量左值只能引用非常量左值,非常量右值只能引用非常量右值。常量右值可以引用,常量右值和非常量右值,而常量左值可以引用所有(這是個萬金油)。

左值引用,也是左值的別名;右值引用則是對這些不具名的右值變數的別名。

2、神馬叫移動語義

拷貝建構函式中為指標成員分配新的記憶體再進行內容拷貝的深拷貝模式,在C++中幾乎是不可違背的。但有些時候,我們並不需要這樣的拷貝構造語義。比如在拷貝構造的時候,我們不再分配新的記憶體,而是直接借用引用物件的記憶體呢。這種構造方式,被稱作移動構造。而這種行為,就叫“移動語義”(move semantics)。

如果有較大的記憶體需要處理,只使用指標的移動語義,就會對效能產生驚人的提升!

3、移動語義怎馬用

T &&a = ReturnRValue();

函式返回值的生命週期,將和a 的生命週期一樣。

T b = ReturnRValue();

該語句和上面相比,將多一次構造和析構。

注:主要參考《深入理解C++11》