首先看一下c++11標準新特性:
右值引用:
右值引用 (rvalue referene) 是 c++ 新標準 (c++11, 11 代表 2011 年 ) 中引入的新特性 , 它實現了轉移語義 (move sementics) 和精確傳遞 (perfect forwarding)。它的主要目的有兩個方面:
1、消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。
2、能夠更簡潔明確地定義泛型函式。
左值vs右值:
通俗的左值的定義就是非臨時物件,那些可以在多條語句中使用的物件。所有的變數都滿足這個定義,在多條**中都可以使用,都是左值。右值是指臨時的物件,它們只在當前的語句中有效。
例如:int i= 10;//i 是左值,0是臨時值所以0是右值,i可以被引用,但是0不可以。
#include "stdafx.h"
#include#includeusing namespace std;
class mystring
public:
mystring()
mystring(const char* p)
mystring(const mystring& str)
mystring& operator=(const mystring& str)
std::cout << "copy assignment is called! source: " << str._data << std::endl;
return *this;
} virtual ~mystring()
mystring(mystring&& str)//引數為右值
/*由此看出,編譯器區分了左值和右值,對右值呼叫了轉移建構函式和轉移賦值操作符。節省了資源,提高了程式執行的效率。
有了右值引用和轉移語義,我們在設計和實現類時,對於需要動態申請大量資源的類,應該設計轉移建構函式和轉移賦值函式,以提高應用程式的效率。*/
};int main()
轉移語義:
右值引用是用來支援轉移語義的。轉移語義可以將資源 ( 堆,系統物件等 ) 從乙個物件轉移到另乙個物件,這樣能夠減少不必要的臨時物件的建立、拷貝以及銷毀,能夠大幅度提高 c++ 應用程式的效能。臨時物件的維護 ( 建立和銷毀 ) 對效能有嚴重影響。
通過轉移語義,臨時物件中的資源能夠轉移其它的物件裡。
在現有的 c++ 機制中,我們可以定義拷貝建構函式和賦值函式。要實現轉移語義,需要定義轉移建構函式,還可以定義轉移賦值操作符。對於右值的拷貝和賦值會呼叫轉移構造函 數和轉移賦值操作符。如果轉移建構函式和轉移拷貝操作符沒有定義,那麼就遵循現有的機制,拷貝建構函式和賦值操作符會被呼叫。
普通的函式和操作符也可以利用右值引用操作符實現轉移語義。
標準庫std::move
std::move在提高 swap 函式的的效能上非常有幫助,一般來說,swap函式的通用定義如下:
template swap(t& a, t& b)
有了 std::move,swap 函式的定義變為 :
template swap(t& a, t& b)
通過 std::move,乙個簡單的 swap 函式就避免了 3 次不必要的拷貝操作。
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...
C 11 左值 右值 右值引用詳解
在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a 就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int fun...