亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++11中的右值引用與移動語義

2020-05-23 13:53:23
字體:
來源:轉載
供稿:網友

C++11的一個最主要的特性就是可以移動而非拷貝對象的能力。很多情況都會發生對象的拷貝,有時對象拷貝后就立即銷毀,在這些情況下,移動而非拷貝對象會大幅度提升性能。

c++,11,右值引用,移動語義

右值與右值引用

為了支持移動操作,新標準引入了一種新的引用類型——右值引用,就是必須綁定到右值的引用。我們通過&&而不是&來獲得右值引用。右值引用一個重要的特性就是只能綁定到將要銷毀的對象。

左值和右值是表達式的屬性,一些表達式生成或要求左值,而另一些則生成或要求右值。一般而言,一個左值表達式表示的是一個對象的身份,而右值表達式表示的是對象的值。(可以取地址的、有名字的就是左值;不能取地址的、沒有名字的就是右值。)兩者明顯的區別就是左值有持久的狀態,而右值要么是字面常量,要么是在表達式求值過程中創建的臨時對象。

類似于常規引用(左值引用),一個右值引用也不過是某個對象的另一個名字而已。我們不能將左值引用綁定到要求轉換的表達式、字面常量或是返回值的表達式,也不能把右值應用直接綁定到一個左值上。但是,常量左值引用可以綁定到非常量左值、常量左值、右值,是一個萬能引用類型。不過相比右值引用所引用的右值,常量左值引用所引用的右值在它的“余生”中只能是只讀的。

int i = 42;int &r = i;     //r引用iint &r2 = i*2;    //錯誤,i*2是一個右值int &&rr = i;    //錯誤,不能將一個右值引用綁定到一個左值上int &&rr2 = i*2;   //正確,將rr2綁定到一個乘法結果上const int &r3 = i*2; //正確,將一個常量引用綁定到一個右值上

變量可以看做只有一個運算對象而沒有運算符的表達式,是一個左值。我們不能將一個右值引用直接綁定到一個變量上,即使這個變量是右值引用類型。但是,我們可以通過新標準庫中的move函數來獲得綁定到左值上的右值引用。

int &&rr3 = std::move(rr2);

注意,被轉化的左值,其生命周期并沒有隨著左右至的轉化而改變,在轉換之后使用左值可能造成運行時錯誤。因此,調用move就意味著承諾:除了對原左值變量賦值或銷毀它外,我們將不再使用它。不過更多的時候,我們需要轉換成右值引用的還是一個確實生命周期即將結束的對象。

移動構造函數和移動賦值運算符

為了讓自定義類型也支持移動操作,需要為其定義移動構造函數和移動賦值運算符。這兩個成員類似對應的拷貝操作,但它們從給定對象竊取資源而不是拷貝資源。類似于拷貝構造函數,移動構造函數的第一個參數是該類類型的一個右值引用,任何額外的參數都必須有默認實參。除了完成資源移動外,移動構造函數還必須確保移后源對象處于有效的、可析構的狀態。

#include <iostream> #include <algorithm> class MemoryBlock { public:   // 構造函數  explicit MemoryBlock(size_t length) : _length(length) , _data(new int[length]) {}   // 析構函數   ~MemoryBlock()   {    if (_data != nullptr)  delete[] _data;  }   // 拷貝賦值運算符   MemoryBlock& operator=(const MemoryBlock& other)   {     if (this != &other)     {       delete[] _data;       _length = other._length;       _data = new int[_length];       std::copy(other._data, other._data + _length, _data);     }     return *this;   }   // 拷貝構造函數   MemoryBlock(const MemoryBlock& other)     : _length(0)     , _data(nullptr)   {     *this = other;   }   // 移動賦值運算符,通知標準庫該構造函數不拋出任何異常(如果拋出異常會怎么樣?)  MemoryBlock& operator=(MemoryBlock&& other) noexcept  {    if (this != &other)     {        delete[] _data;       // 移動資源      _data = other._data;       _length = other._length;       // 使移后源對象處于可銷毀狀態      other._data = nullptr;       other._length = 0;     }     return *this;   }  // 移動構造函數  MemoryBlock(MemoryBlock&& other) noexcept    _data(nullptr)     , _length(0)   {     *this = std::move(other);   }   size_t Length() const   {     return _length;   } private:   size_t _length; // The length of the resource.   int* _data; // The resource. };

只有當一個類沒有定義任何自己版本的拷貝控制成員,且類的每個非static數據成員都可移動時,編譯器才會為它合成移動構造函數會移動賦值運算符。編譯器可以移動內置類型;如果一個類類型有對應的移動操作,編譯器也能移動這個類型的成員。此外,定義了一個移動構造函數或移動賦值運算符的類必須也定義自己的拷貝操作;否則,這些成員默認地定義為刪除的。而移動操作則不同,它永遠不會隱式定義為刪除的。但如果我們顯式地要求編譯器生成=defualt的移動操作,且編譯器不能移動所有成員,則編譯器會將移動操作定義為刪除的函數。

如果一個類既有移動構造函數又有拷貝構造函數,編譯會使用普通的函數匹配規則來確定使用哪個構造函數。但如果只定義了拷貝操作而未定義移動操作,編譯器不會合成移動構造函數,此時即使調用move來移動它們,也是調用的拷貝操作。

class Foo{public:  Foo() = default;  Foo(const Foo&);  // 為定義移動構造函數};Foo x;Foo y(x);         //調用拷貝構造函數Foo z(std::move(x));   //調用拷貝構造函數,因為未定義移動構造函數

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美一区二区三区久久| 黄色成人在线播放| 欧洲美女7788成人免费视频| 亚洲免费精彩视频| 欧美激情在线狂野欧美精品| 成人黄色午夜影院| 欧美性xxxxx极品| 精品久久久久久久久久国产| 亚洲午夜国产成人av电影男同| 日本成人黄色片| 福利一区视频在线观看| 欧美色道久久88综合亚洲精品| 8x海外华人永久免费日韩内陆视频| 欧美午夜激情在线| 欧美另类在线观看| 日本午夜精品理论片a级appf发布| 久久精品国产一区二区三区| 日韩av综合网站| 欧美成人性色生活仑片| 91亚洲精品久久久| 在线视频国产日韩| 国产精品久久久亚洲| 久久综合网hezyo| 久久影院资源网| 欧美性高潮在线| 欧美成人在线影院| 国产在线98福利播放视频| 国产精品激情av在线播放| 欧美做受高潮电影o| 日韩高清电影免费观看完整版| 欧美xxxx做受欧美| 不用播放器成人网| 国产视频在线一区二区| 成人xvideos免费视频| 国产精品三级在线| 国产精品露脸av在线| 国产精品美女呻吟| 国产精品一区二区性色av| 在线播放日韩欧美| 欧美xxxx综合视频| 亚洲精品电影久久久| 欧美日韩中国免费专区在线看| 国产精品爽黄69天堂a| 国产精品私拍pans大尺度在线| 欧美激情成人在线视频| 精品国产自在精品国产浪潮| 中文字幕亚洲一区二区三区五十路| 亚洲视频国产视频| 国产女人18毛片水18精品| 国产成人高清激情视频在线观看| 亚洲色图13p| 精品久久久久久久中文字幕| 最近2019中文字幕大全第二页| 日韩**中文字幕毛片| 亚洲精品mp4| 在线播放国产一区中文字幕剧情欧美| 国产综合在线观看视频| 久久久久久伊人| 欧美黑人又粗大| 日韩电影在线观看中文字幕| 国产亚洲一区二区精品| 日韩中文综合网| 国产ts一区二区| 国产在线观看不卡| 狠狠躁夜夜躁人人爽超碰91| 91精品久久久久久| 国产色视频一区| 亚洲图片欧美日产| 亚洲色图13p| 欧美肥老太性生活视频| 2019最新中文字幕| 亚洲色图偷窥自拍| yellow中文字幕久久| 17婷婷久久www| 欧美成人免费播放| 日韩在线播放一区| 亚洲美女视频网| 操人视频在线观看欧美| 欧美性生交大片免费| 日韩一级裸体免费视频| 欧美精品videosex性欧美| 精品久久久久国产| 国产欧美最新羞羞视频在线观看| 91精品国产综合久久久久久久久| 精品久久中文字幕久久av| 日本在线观看天堂男亚洲| 精品国产91久久久| 黄色成人在线播放| 亚洲欧美国产精品va在线观看| 久久国产精品99国产精| 一区二区三区日韩在线| 国产精品综合久久久| 九九久久综合网站| 亚洲天堂成人在线视频| 17婷婷久久www| 国产精品99免视看9| 亚洲综合在线播放| 欧美在线视频一区| 久久久亚洲影院你懂的| 91精品久久久久| 亚洲最大成人免费视频| 国产美女精品视频免费观看| 国产视频精品自拍| 精品一区精品二区| 国产精品日韩精品| 国外色69视频在线观看| 亚洲精品自拍视频| 国产成人精品视频在线| 成人免费网站在线观看| 欧美放荡办公室videos4k| 欧美午夜www高清视频| 亚洲视频日韩精品| www.日韩欧美| 国产精品国产亚洲伊人久久| 亚洲国产免费av| 九九九久久国产免费| 奇米4444一区二区三区| 亚洲区bt下载| 国产一区二区三区在线观看视频| 国产一区二区三区18| 久久久久国色av免费观看性色| 2019国产精品自在线拍国产不卡| 国产成人a亚洲精品| 欧美日产国产成人免费图片| 国产精品观看在线亚洲人成网| 91豆花精品一区| 亚洲最大的av网站| 91精品国产91久久久久久久久| 欧美国产第二页| 中文字幕日韩av综合精品| 91日本在线观看| 美女啪啪无遮挡免费久久网站| 国产精品永久免费| 欧美日韩性生活视频| 成人午夜在线视频一区| 久久久免费精品| 亚洲自拍偷拍一区| 亚洲深夜福利视频| 亚洲字幕一区二区| 欧美电影《睫毛膏》| 97久久久久久| 亚洲视屏在线播放| 国产精品白丝av嫩草影院| 日韩在线欧美在线国产在线| 高清在线视频日韩欧美| 久久99精品久久久久久琪琪| 亚洲午夜激情免费视频| 成人黄色av网| 国外成人在线播放| 尤物精品国产第一福利三区| 高清欧美电影在线| 日韩av中文字幕在线| 国产视频福利一区| 欧美激情精品久久久久久免费印度| 欧美电影免费在线观看| 狠狠色香婷婷久久亚洲精品| 97色在线播放视频| 国产成+人+综合+亚洲欧洲| 91精品视频免费观看| 国产精品美女主播在线观看纯欲| 亚洲影院色在线观看免费| 久久久久久中文| 亚洲成在人线av| 蜜臀久久99精品久久久无需会员|