C 11左值右值 轉移語義

2021-07-22 21:59:41 字數 1679 閱讀 7079

首先看一下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...