日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

右值引用的使用场景

發布時間:2024/3/26 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 右值引用的使用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

與其長篇大論的講原理,不如先舉幾個栗子。

1. 函數傳參
struct DATA {string value1;string value2;DATA(string v1, string v2) : value1(v1), value2(v2) {std::cout << "DATA" << std::endl;}DATA(const DATA& c) { std::cout << "copy DATA" << std::endl; }~DATA() { std::cout << "~DATA" << std::endl; } };void print(DATA&& d) { std::cout << d.value1 << ":" << d.value2 << std::endl; } void print1(DATA d) { std::cout << d.value1 << ":" << d.value2 << std::endl; }void test1() {DATA d("5", "function");print(std::move(d));print1(d); }

如上,print傳入d的左值比print1少一次拷貝。
但在實際應用中,我們更喜歡下面的寫法,即使用const引用,簡介明了,同樣也減少了不必要的拷貝。

void print2(const DATA& d) { std::cout << d.value1 << ":" << d.value2 << std::endl; }
2. 移動語義

移動語義,其實就是實現類的移動構造函數

#include <iostream> using namespace std;class demo {public:demo() : num(new int(0)) { cout << "construct!" << endl; }//拷貝構造函數demo(const demo &d) : num(new int(*d.num)) {cout << "copy construct!" << endl;}~demo() { cout << "class destruct!" << endl; }private:int *num; };demo get_demo() { return demo(); }int main() {demo a = get_demo();return 0; }

上面的代碼,如果不經過優化,會進行兩次copy。(編譯器默認開啟優化)

[root@localhost test-codes]# g++ -std=c++11 -fno-elide-constructors 02con.cpp -o 02con [root@localhost test-codes]# ./02con construct! copy construct! class destruct! copy construct! class destruct! class destruct! [root@localhost test-codes]# g++ -std=c++11 02con.cpp -o 02con [root@localhost test-codes]# ./02con construct! class destruct!

通過淺拷貝方式實現移動構造函數

//移動構造函數demo(demo &&d):num(d.num){d.num = NULL;cout<<"move construct!"<<endl;}

測試

[root@localhost test-codes]# g++ -std=c++11 -fno-elide-constructors 02con.cpp -o 02con [root@localhost test-codes]# ./02con construct! move construct! class destruct! move construct! class destruct! class destruct!

當類中同時包含拷貝構造函數和移動構造函數時,如果使用臨時對象初始化當前類的對象,編譯器會優先調用移動構造函數來完成此操作。只有當類中沒有合適的移動構造函數時,編譯器才會退而求其次,調用拷貝構造函數。

參考

這就是移動語義,似乎看起來沒多少東西,但確實大大提高了C++的性能。

3. 完美轉發

完美轉發,在實際開發當中,可能用的比較少。
所謂完美轉發就是指函數模板可以將自己的參數“完美”地轉發給內部調用的其它函數。所謂完美,即不僅能準確地轉發參數的值,還能保證被轉發參數的左、右值屬性不變

template<typename T> void function1(T t) {function2(t); }

如上,t在function1中是左值,那么在function2中還是左值;t在function1中是右值,那么在function2中還是右值。這就是完美轉發。
很明顯上面這個模板函數,并沒有實現完美轉發。因為function2中的t肯定是左值。另外如果t不是引用類型,function1調用function2時還會發生一次拷貝。
那么怎么實現完美轉發呢?如下,就是這么簡單,加&&

void function2(int &t) { cout << "左值" << endl; } void function2(const int &t) { cout << "右值" << endl; }template <typename T> void function1(T &&t) {function2(t); }int main() {function1(100); int num = 333;function1(std::move(num));function1(num);return 0; }

實現一下,額。。。好像結果不太對。還得引入一個新的函數

template <typename T> void function1(T &&t) {function2(forward<T>(t)); } [root@localhost test-codes]# ./02con 右值 右值 左值

好了這下輸出對了。

如果之前沒有接觸過右值引用,那么到這里我想可以先停一停。
一定會有很多疑問,std::move和forward是做什么的?簡單說他們可以把左值轉換成右值。

上述只是我對右值引用最簡單的理解,其他更深入的思考可以參考《Effective Modern C++》

總結

以上是生活随笔為你收集整理的右值引用的使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲色域网| 久久精品首页 | 日韩成人在线视频 | 淫视频网站 | 国产综合精品视频 | аⅴ资源天堂资源库在线 | 久久久久国产 | 亚洲人 女学生 打屁股 得到 | 欧美激情区 | 91伦理| 日韩福利视频在线观看 | 丰满肉嫩西川结衣av | 日本免费色视频 | 欧美大片在线看免费观看 | 玖玖视频网 | 国产精品99久久久久久宅男 | 老熟妇精品一区二区三区 | 婷婷国产视频 | 日韩丰满少妇无码内射 | 色玖玖综合| 午夜免费小视频 | 亚洲美女视频一区 | 精品欧美视频 | 天堂久久爱 | 久久国产免费视频 | 一级黄色淫片 | 在线视频观看一区二区 | 第一毛片| 日韩色小说 | 777免费视频 | 欧美日韩一区二区三区在线播放 | 成人av男人的天堂 | 饥渴丰满的少妇喷潮 | 欧美日韩二三区 | 99网站| 国产亚洲欧美一区二区三区 | 在线看黄网 | 色av吧| 少妇高潮视频 | 美女让男生桶 | 夜夜春夜夜爽 | 久久人人爽天天玩人人妻精品 | 日韩精品在线网站 | 亚洲精品福利在线观看 | 久久在线看 | 欧美视频在线一区 | 男女在线视频 | 九九免费| 不卡av影院| 欧美日韩高清一区二区 | 久久久三区| 一个人免费在线观看视频 | 精品不卡在线 | 午夜一区二区三区在线观看 | 一级片久久久久 | 黄页网站免费观看 | 亚洲丝袜天堂 | 国产黑丝在线视频 | 亚洲AV无码一区二区伊人久久 | 成人国产精品一区二区 | 四虎网址在线观看 | 日韩久久免费视频 | 奇米影视在线视频 | 色哟哟在线视频 | 成人av免费 | 9i在线看片成人免费 | 日韩无码精品一区二区三区 | 少妇无码吹潮 | 激情四射综合网 | 五月婷婷色综合 | 国产成人福利视频 | 亚洲蜜臀av一区二区三区 | 色天堂在线视频 | 3p在线播放 | 秋霞午夜网 | a级免费观看 | 91av国产视频 | 色噜噜一区二区三区 | 国产精品99久久久久久动医院 | 扶她futa粗大做到怀孕 | 99久久精品免费看国产 | 久久xx | 精品一区二区久久久久久久网站 | 撕开少妇裙子猛然进入 | 久久久久久婷婷 | 97国产成人无码精品久久久 | 精品一区欧美 | 精品国产免费人成在线观看 | av在线成人 | www.日韩| 国产精品高潮呻吟 | 337p粉嫩日本欧洲亚洲大胆 | 少妇一级淫片免费观看 | 国产又粗又大又硬 | 综合网五月天 | 非洲黄色一级片 | 国产中文字幕一区二区三区 | 香蕉钻洞视频 | 91国偷自产中文字幕久久 |