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

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

C++11右值引用和std::move語句實例解析(推薦)

2020-01-26 14:12:54
字體:
來源:轉載
供稿:網友

右值引用(及其支持的Move語意和完美轉發)是C++0x將要加入的最重大語言特性之一。從實踐角度講,它能夠完美解決C++中長久以來為人所詬病的臨時對象效率問題。從語言本身講,它健全了C++中的引用類型在左值右值方面的缺陷。從庫設計者的角度講,它給庫設計者又帶來了一把利器。從庫使用者的角度講,不動一兵一卒便可以獲得“免費的”效率提升…

下面用實例來深入探討右值引用。

1.什么是左值,什么是右值,簡單說左值可以賦值,右值不可以賦值。以下面代碼為例,“A a = getA();”該語句中a是左值,getA()的返回值是右值。

#include "stdafx.h"#include <iostream>class A{public:  A() { std::cout << "Constructor" << std::endl; }  A(const A&) { std::cout << "Copy Constructor" << std::endl; }  ~A() {}};static A getA(){  A a;  return a;}int main(){  A a = getA();  return 0;}

運行以上代碼,輸出結果如下:

Constructor
Copy Constructor

可以看到A的構造函數調用一次,拷貝構造函數調用了一次,構造函數和拷貝構造函數是消耗比較大的,這里是否可以避免拷貝構造?C++11做到了這一點。

2.添加A的移動構造函數,代碼如下:

#include "stdafx.h"#include <iostream>class A{public:  A() { std::cout << "Constructor" << std::endl; }  A(const A&) { std::cout << "Copy Constructor" << std::endl; }  A(const A&&) { std::cout << "Move Constructor" << std::endl; }  ~A() {}};static A getA(){  A a;  return a;}int main(){  A a = getA();  return 0;}

運行以上代碼,輸出結果:

Constructor
Move Constructor

這樣就沒有調用拷貝構造函數,而是調用移動構造。這里并沒有看到移動構造的優點。

3.修改代碼,給A類添加一個成員變量如下:

#include "stdafx.h"#include <iostream>#include <vector>class B{public:  B() {}  B(const B&) { std::cout << "B Constructor" << std::endl; }};class A{public:  A(): m_b(new B()) { std::cout << "A Constructor" << std::endl; }  A(const A& src) :    m_b(new B(*(src.m_b)))  {     std::cout << "A Copy Constructor" << std::endl;  }  A(A&& src) :    m_b(src.m_b)  {    src.m_b = nullptr;    std::cout << "A Move Constructor" << std::endl;  }  ~A() { delete m_b; }private:  B* m_b;};static A getA(){  A a;  std::cout << "================================================" << std::endl;  return a;}int main(){  A a = getA();  std::cout << "================================================" << std::endl;  A a1(a);  return 0;}

運行以上代碼,輸出結果:

A Constructor
================================================
A Move Constructor
================================================
B Constructor
A Copy Constructor

“A a = getA();”調用的是A的移動構造,“A a1(a);”調用的是A的拷貝構造。A的拷貝構造需要對成員變量B進行深拷貝,而A的移動構造不需要,很明顯,A的移動構造效率高。

4.std::move語句可以將左值變為右值而避免拷貝構造,修改代碼如下:

#include "stdafx.h"#include <iostream>#include <vector>class B{public:  B() {}  B(const B&) { std::cout << "B Constructor" << std::endl; }};class A{public:  A(): m_b(new B()) { std::cout << "A Constructor" << std::endl; }  A(const A& src) :    m_b(new B(*(src.m_b)))  {     std::cout << "A Copy Constructor" << std::endl;  }  A(A&& src) :    m_b(src.m_b)  {    src.m_b = nullptr;    std::cout << "A Move Constructor" << std::endl;  }  ~A() { delete m_b; }private:  B* m_b;};static A getA(){  A a;  std::cout << "================================================" << std::endl;  return a;}int main(){  A a = getA();  std::cout << "================================================" << std::endl;  A a1(a);  std::cout << "================================================" << std::endl;  A a2(std::move(a1));  return 0;}

運行以上代碼,輸出結果:

A Constructor
================================================
A Move Constructor
================================================
B Constructor
A Copy Constructor
================================================
A Move Constructor

“A a2(std::move(a1));”將a1轉換為右值,因此a2調用的移動構造而不是拷貝構造。

5.賦值操作符也可以是移動賦值。

#include "stdafx.h"#include <iostream>#include <vector>class B{public:  B() {}  B(const B&) { std::cout << "B Constructor" << std::endl; }};class A{public:  A(): m_b(new B()) { std::cout << "A Constructor" << std::endl; }  A(const A& src) :    m_b(new B(*(src.m_b)))  {     std::cout << "A Copy Constructor" << std::endl;  }  A(A&& src) :    m_b(src.m_b)  {    src.m_b = nullptr;    std::cout << "A Move Constructor" << std::endl;  }  A& operator=(const A& src)  {    if (this == &src)      return *this;    m_b = new B(*(src.m_b));    std::cout << "operator=(const A& src)" << std::endl;    return *this;  }  A& operator=(A&& src)  {    if (this == &src)      return *this;    m_b = src.m_b;    src.m_b = nullptr;    std::cout << "operator=(const A&& src)" << std::endl;    return *this;  }  ~A() { delete m_b; }private:  B* m_b;};static A getA(){  A a;  std::cout << "================================================" << std::endl;  return a;}int main(){  A a = getA();//移動構造  std::cout << "================================================" << std::endl;  A a1(a);//拷貝構造  std::cout << "================================================" << std::endl;  A a2(std::move(a1));//移動構造  std::cout << "================================================" << std::endl;  a2 = getA();//移動賦值  std::cout << "================================================" << std::endl;  a2 = a1;//拷貝賦值  return 0;}

運行以上代碼,輸出結果:

A Constructor
================================================
A Move Constructor
================================================
B Constructor
A Copy Constructor
================================================
A Move Constructor
================================================
A Constructor
================================================
A Move Constructor
operator=(const A&& src)
================================================
B Constructor
operator=(const A& src)

 總之盡量給類添加移動構造和移動賦值函數,而減少拷貝構造和拷貝賦值的消耗。

以上所述是小編給大家介紹的C++11右值引用和std::move語句實例解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文字幕视频在线观看| 亚洲精品av在线| 国产精品入口日韩视频大尺度| 亚洲欧美中文另类| 欧美色另类天堂2015| 中文字幕av一区二区三区谷原希美| 成人激情视频免费在线| 欧美日韩国产黄| 一区二区三区国产视频| 亚洲激情成人网| 欧美激情xxxxx| 亚洲成人精品在线| 精品国产一区二区三区久久狼5月| 日韩av综合网站| 欧美日韩一区二区精品| 8x海外华人永久免费日韩内陆视频| 欧美日韩成人网| 中文字幕在线国产精品| 亚洲精品视频免费| 色狠狠av一区二区三区香蕉蜜桃| 91sao在线观看国产| 久热精品视频在线免费观看| 亚洲日韩中文字幕在线播放| 欧美亚洲国产日本| 欧美激情免费观看| 亚洲自拍小视频免费观看| 日韩电影在线观看中文字幕| 国产精品三级在线| 亚洲久久久久久久久久久| 亚洲午夜激情免费视频| 国产成人涩涩涩视频在线观看| 精品久久在线播放| 成人av在线天堂| 日韩精品亚洲精品| 精品自拍视频在线观看| 成人午夜两性视频| 亚洲精品中文字幕有码专区| 日韩男女性生活视频| 亚洲精品久久久久中文字幕二区| 亚洲国产女人aaa毛片在线| 国产精品久久不能| 亚洲国产美女精品久久久久∴| www.日本久久久久com.| 久久精品影视伊人网| 国产一区香蕉久久| 欧美视频二区36p| 欧美精品videos性欧美| 久久理论片午夜琪琪电影网| 亚洲美女视频网| 日韩精品999| 911国产网站尤物在线观看| 亚洲第一免费播放区| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲国产精品热久久| 91干在线观看| 亚洲开心激情网| 亚洲美女福利视频网站| 国内精品中文字幕| 国产精品视频区1| 国产精品影片在线观看| 91精品久久久久久久久久入口| 日韩亚洲欧美中文在线| 北条麻妃在线一区二区| 亚洲女人被黑人巨大进入al| 欧美高清视频在线播放| 国产日韩精品在线观看| 久久亚洲欧美日韩精品专区| 91精品视频免费看| 精品福利一区二区| 久久777国产线看观看精品| xvideos成人免费中文版| 国产精品成人av性教育| 久久亚洲综合国产精品99麻豆精品福利| 国产日韩中文字幕| 国产精品成人免费视频| 亚洲成人中文字幕| 日韩欧美黄色动漫| 亚洲欧美国产精品专区久久| 亚洲激情在线视频| 亚洲欧美视频在线| 91性高湖久久久久久久久_久久99| 久久久精品视频成人| 中文字幕国产亚洲2019| 亚洲成av人乱码色午夜| 午夜精品久久17c| 亚洲女人被黑人巨大进入| 成人黄色短视频在线观看| 成人国内精品久久久久一区| 日韩高清免费在线| 国产精品久久久久久久久借妻| 欧美日韩国产一区二区三区| 日韩av电影手机在线观看| 亚洲天堂av在线播放| 亚洲激情在线视频| 久久久久久久爱| 欧美激情2020午夜免费观看| 亚洲人成人99网站| 国产婷婷97碰碰久久人人蜜臀| 国产日韩在线精品av| 国产91精品久久久| 综合久久五月天| 日韩精品在线免费观看视频| 亚洲视频精品在线| 国产91精品在线播放| 国产在线精品成人一区二区三区| 亚洲精品第一国产综合精品| 国产精品国内视频| 色综合亚洲精品激情狠狠| 欧美最猛性xxxxx免费| 久久这里只有精品视频首页| 亚洲精品国精品久久99热| 国产激情综合五月久久| 亚洲欧美日韩国产中文专区| 亚洲2020天天堂在线观看| 欧美与黑人午夜性猛交久久久| 久久精品亚洲精品| 国产精品亚洲欧美导航| 欧美激情视频一区二区三区不卡| 亚洲精品久久久一区二区三区| 国产欧美中文字幕| 日韩av在线免费观看| 91久久精品国产91久久性色| 欧美精品免费在线观看| 蜜臀久久99精品久久久久久宅男| 亚洲欧美激情一区| 26uuu亚洲国产精品| 亚洲精品999| 亚洲成人网av| 精品久久久久久久久久| 久久精品国产一区二区电影| 国产精品久久久久91| 在线观看成人黄色| 欧美激情视频一区二区| 国产精品劲爆视频| 亚洲欧美综合另类中字| 日韩视频免费观看| 91美女片黄在线观| 欧美大片网站在线观看| 丝袜美腿亚洲一区二区| 色www亚洲国产张柏芝| 亚州精品天堂中文字幕| 成人国产亚洲精品a区天堂华泰| 欧美自拍视频在线| 欧美国产精品人人做人人爱| 亚洲乱码一区二区| 久久综合久中文字幕青草| 日韩暖暖在线视频| 亚洲国产天堂久久综合网| 国语自产精品视频在线看一大j8| 日韩成人在线视频观看| 欧美亚洲在线观看| 91精品久久久久久久久青青| 91中文精品字幕在线视频| 国产精品爽爽爽爽爽爽在线观看| 久久青草精品视频免费观看| 亚洲天天在线日亚洲洲精| 正在播放国产一区| 欧美成人激情视频| 国产精品久久久久久久久久久新郎| 久久99久久99精品中文字幕| 91老司机精品视频| 欧美激情精品久久久久久蜜臀| 国产激情久久久| 国产精品欧美一区二区|