最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

補(bǔ)充——右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)

2023-04-04 23:34 作者:努力賺錢養(yǎng)朵朵  | 我要投稿


本章為C++11/14中右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)的補(bǔ)充知識(shí)。(程序設(shè)計(jì)比賽和相關(guān)考試中一般不會(huì)用但是超時(shí)的時(shí)候可以提點(diǎn)速度試試,屬于是選修課了...)

右值引用

C++引入了右值引用和移動(dòng)語義,以避免無謂的復(fù)制,優(yōu)化內(nèi)存、提高程序性能。

①左值和右值

左值:指的是表達(dá)式結(jié)束后依然存在的持久化對(duì)象。

右值:指的是表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對(duì)象。

C++中所有的值必然屬于左值、右值二者之一。

所有的具名變量或?qū)ο蠖际亲笾?,而右值不具名?/p>

區(qū)分左值和右值的便捷方法:看能不能對(duì)表達(dá)式取地址,如果能,則為左值,否則為右值。

②左值引用、右值引用

C++11中的右值引用使用的符號(hào)是“&&”,如:

getTemp()返回的右值本來在表達(dá)式語句結(jié)束后,其生命也就該終結(jié)了(因?yàn)槭桥R時(shí)變量),而通過右值引用,該右值又重獲新生,其生命期將與右值引用類型變量a的生命期一樣,只要a還活著,該右值臨時(shí)變量將會(huì)一直存活下去。實(shí)際上就是給那個(gè)臨時(shí)變量取了個(gè)名字。

注意:這里a的類型是右值引用類型(int &&),但是如果從左值和右值的角度區(qū)分它,它實(shí)際上是個(gè)左值。因?yàn)榭梢詫?duì)它取地址,而且它還有名字,是一個(gè)已經(jīng)命名的右值。所以,左值引用只能綁定左值,右值引用只能綁定右值,如果綁定的不對(duì),編譯就會(huì)失敗。

常量左值引用可以綁定非常量左值、常量左值、右值,而且在綁定右值的時(shí)候,常量左值引用還可以像右值引用一樣將右值的生命期延長,缺點(diǎn)是【只能讀不能改】。

總結(jié),其中T是一個(gè)具體類型:
1)左值引用, 使用T&,只能綁定左值
2)右值引用,使用T&&,只能綁定右值。
3)常量左值,使用const T&,既可以綁定左值也可以綁定右值。
4)已命名的右值引用,編譯器會(huì)認(rèn)為是左值。
5)編譯器有返回值優(yōu)化,但不要過于依賴。


移動(dòng)語義之move

c++11中的所有容器都實(shí)現(xiàn)了move語義,move只是轉(zhuǎn)移了資源的控制權(quán),本質(zhì)上是將左值強(qiáng)制轉(zhuǎn)化為右值使用,以用于移動(dòng)拷貝或賦值,避免對(duì)含有資源的對(duì)象發(fā)生無謂的拷貝。move對(duì)于擁有如內(nèi)存、文件句柄等資源的成員的對(duì)象有效,如果是一些基本類型,如int和char[10]數(shù)組等,如果使用move,仍會(huì)發(fā)生拷貝(因?yàn)闆]有對(duì)應(yīng)的移動(dòng)構(gòu)造函數(shù)),所以說move對(duì)含有資源的對(duì)象說更有意義。


完美轉(zhuǎn)發(fā)

所謂轉(zhuǎn)發(fā),就是通過一個(gè)函數(shù)將參數(shù)繼續(xù)轉(zhuǎn)交給另一個(gè)函數(shù)進(jìn)行處理,原參數(shù)可能是右值,可能是左值,如果還能繼續(xù)保持參數(shù)的原有特征,那么它就是完美的。C++中可以借助universal references通用引用類型和std::forward()模板函數(shù)共同實(shí)現(xiàn)完美轉(zhuǎn)發(fā)。(具體可見鏈接https://blog.csdn.net/locahuang/article/details/118755897)

(常用)容器中減少內(nèi)存拷貝和移動(dòng)(常用)

使用vector容器一般都會(huì)用push_back()添加元素,這容易發(fā)生無意義的拷貝,解決辦法就是為類增加移動(dòng)拷貝和賦值函數(shù),但其實(shí)可以直接使用emplace_back()函數(shù)代替push_back()。

emplace_back()可以直接通過構(gòu)造函數(shù)的參數(shù)構(gòu)造對(duì)象,但前提是要有對(duì)應(yīng)的構(gòu)造函數(shù)。在上面的代碼中,也可以看到由于減少了拷貝,emplace_back()確實(shí)耗時(shí)小于push_back()。

對(duì)于map和set,可以使用emplace()代替insert()。


補(bǔ)充——右值引用、移動(dòng)語義、完美轉(zhuǎn)發(fā)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
左权县| 合肥市| 金堂县| 宁德市| 灵山县| 泰顺县| 广南县| 峨边| 乃东县| 枣阳市| 城步| 鲁山县| 游戏| 安塞县| 海宁市| 遂溪县| 虞城县| 桃园县| 马边| 双辽市| 抚顺县| 留坝县| 江山市| 馆陶县| 手游| 繁峙县| 观塘区| 临西县| 盖州市| 望城县| 天津市| 徐州市| 江达县| 康保县| 华坪县| 肇源县| 虞城县| 潼关县| 新乐市| 蓬莱市| 平乡县|