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

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

深入淺出C++:移動(dòng)語(yǔ)義不移動(dòng)

2021-12-20 18:27 作者:飛翔の回聲_FlappyEcho  | 我要投稿

注:本文在2022年6月1日進(jìn)行了一定程度的修改,本文在之前所講述內(nèi)容的結(jié)論并沒(méi)有改動(dòng),只是擴(kuò)展了一些之前文中并沒(méi)有提到但與移動(dòng)語(yǔ)義相關(guān)的內(nèi)容。

結(jié)論先行:將【移動(dòng)拷貝】當(dāng)做一個(gè)面向【即將消逝對(duì)象】的特化版【拷貝操作】。

?

????移動(dòng)語(yǔ)義是C++11引入的概念,也是相較于C++03的一條重要改變。應(yīng)該可以這么說(shuō):是移動(dòng)語(yǔ)義的加入,使C++重新回到了神壇,STL那令人作嘔的拷貝成本因他的加入得到了一定程度的解決。今天,我嘗試以我個(gè)人的方式,深入淺出來(lái)簡(jiǎn)單談一談我對(duì)右值引用的理解。

????但個(gè)人理解,針對(duì)不同對(duì)象肯定會(huì)有點(diǎn)出入,如果讀者無(wú)法理解我所說(shuō)的,就請(qǐng)嘗試不要去強(qiáng)行理解了,畢竟每個(gè)人理解知識(shí)點(diǎn)的方式不一樣,不必要強(qiáng)行一致。


????文章開(kāi)始之前,咱們或許應(yīng)該理解一下簡(jiǎn)單的左值和右值的概念,但其實(shí)這個(gè)東西細(xì)分起來(lái)多少會(huì)有點(diǎn)麻煩,因?yàn)橐?guī)范上,左值和右值也只是很寬泛的稱(chēng)呼,更詳細(xì)的包括有范左值、純右值、亡值、左值、右值等稱(chēng)呼,我直接放一個(gè)最官方的解釋在這里,有需要的可以自行看:

<https://zh.cppreference.com/w/cpp/language/value_category>

? ? 請(qǐng)注意,在接下來(lái)特地談到RVO(編譯器返回值優(yōu)化)之前,我們的代碼不考慮RVO。

????讓我們?cè)O(shè)想這樣一個(gè)簡(jiǎn)單的類(lèi)和函數(shù):

????在上面的代碼中,脫離返回值優(yōu)化的情況下,對(duì)象被構(gòu)造了三次。

????Data temp(a)調(diào)用一次,而且在return temp的時(shí)候,還會(huì)調(diào)用一次左值拷貝構(gòu)造,不僅如此,當(dāng)返回值被接受給外面的dat的時(shí)候,又發(fā)生了一次左值拷貝。

????要知道,每一個(gè)對(duì)象的產(chǎn)生,都是需要代價(jià)的,那些經(jīng)典的書(shū)籍上(比如Effective C++)無(wú)不強(qiáng)調(diào)要避免多余的構(gòu)造及對(duì)象產(chǎn)生。

????可即便如此,有一點(diǎn)仍然是無(wú)法避免的:

????但凡有一個(gè)拷貝,那么一個(gè)對(duì)象必須會(huì)產(chǎn)生?。

????我詳細(xì)解釋一下這句話,就拿那個(gè)Data類(lèi)來(lái)說(shuō),當(dāng)一個(gè)【Data的對(duì)象a】要以【Data的對(duì)象b】為素本(接下來(lái)我會(huì)以素體或是素本來(lái)指代這些拷貝對(duì)象時(shí)用作參照的對(duì)象)產(chǎn)生拷貝操作了,那么對(duì)象a的內(nèi)存無(wú)論如何都會(huì)開(kāi)辟,對(duì)象a也無(wú)論如何都會(huì)構(gòu)造,除非是使用reference或者pointer to 對(duì)象b。

????當(dāng)然,編譯器返回值優(yōu)化的后面再說(shuō),我再次強(qiáng)調(diào)一下,沒(méi)有特別說(shuō)明的話,我的所有說(shuō)法都默認(rèn)關(guān)閉編譯器返回值優(yōu)化。

????在了解了這個(gè)基礎(chǔ)的情況以后,我們將上述代碼改動(dòng)成這樣。

?????在這個(gè)類(lèi)的設(shè)計(jì)中,我們不再讓這個(gè)類(lèi)產(chǎn)生的對(duì)象擁有【數(shù)據(jù)本身】,而改成了一個(gè)【指向數(shù)據(jù)的指針】,而為了方便理解,我也就不用智能指針了。

????這個(gè)改動(dòng)對(duì)【指向?qū)ο蟮闹羔槨恳餐瑯舆m用,總歸就是: 我想要的數(shù)據(jù)不在對(duì)象里,而是在堆區(qū)的某處,而我擁有的是記錄它所在位置的地址。(這個(gè)是指針的基本功,不懂的同學(xué)得去補(bǔ)充基礎(chǔ))

????這樣的對(duì)象在拷貝的時(shí)候,就會(huì)出現(xiàn)深淺拷貝問(wèn)題。

????我是想要一個(gè)指向同一數(shù)據(jù)的拷貝對(duì)象?還是想要一個(gè)【數(shù)據(jù)內(nèi)容】和素體一模一樣,但【并非同一個(gè)數(shù)據(jù)】的拷貝對(duì)象?

????一般而言,當(dāng)素體的生命周期仍然很長(zhǎng),也就是我們還要使用素體的時(shí)候,我們不應(yīng)該使用淺拷貝,因?yàn)槟菚?huì)讓拷貝對(duì)象指向與素體相同的數(shù)據(jù),最后當(dāng)我們修改了拷貝對(duì)象的時(shí)候,素體內(nèi)指針?biāo)傅臄?shù)據(jù)本體也發(fā)生了更改。

????于是,在這種情況下,我們理所應(yīng)當(dāng)?shù)倪x擇了深拷貝,就像我在上述代碼中寫(xiě)的那樣,左值拷貝函數(shù)內(nèi),我要為val重新動(dòng)態(tài)分配內(nèi)存,分配的空間要和素體一樣,然后再一個(gè)一個(gè)賦值,在這個(gè)過(guò)程里,我們不但生成了一個(gè)拷貝體的空間,還要生成一個(gè)val所指數(shù)據(jù)的空間,若是將val改為一個(gè)對(duì)象指針,我們也可以說(shuō),在這個(gè)過(guò)程里我們進(jìn)行了兩次構(gòu)造:

????對(duì)象本身的構(gòu)造 + 對(duì)象內(nèi)指針指向的堆區(qū)資源的構(gòu)造(或者說(shuō)空間分配)。

????這樣的情況可以用下面的話來(lái)解釋?zhuān)?br>

????一個(gè)拷貝構(gòu)造,其實(shí)進(jìn)行了復(fù)數(shù)次構(gòu)造操作,或者說(shuō)資源分配操作。

????這是我們?yōu)榱说玫健緝?nèi)容一樣,但是卻不是同一個(gè)】拷貝體所付出的必要代價(jià)。在這里,拷貝體與素體的val是不同的,val是指針,指針是存儲(chǔ)地址的變量。

????這兩個(gè)val的值不一樣????代表著????他們所指向的地址不一樣

????即它們所指向的數(shù)據(jù)并不是同一個(gè)數(shù)據(jù),但是這兩個(gè)數(shù)據(jù),它們的內(nèi)容是相同的。我做這么套娃的解釋是為了給一些指針基礎(chǔ)可能有些薄弱的同學(xué)看,它看上去套娃,但其實(shí)本質(zhì)很簡(jiǎn)單。

????在沒(méi)有右值拷貝的過(guò)程中,幾乎所有拷貝操作都會(huì)按你的這個(gè)思路來(lái)進(jìn)行。畢竟你設(shè)計(jì)這個(gè)左值拷貝構(gòu)造函數(shù),就是為了讓對(duì)象以某個(gè)素體為參照生成一個(gè)【內(nèi)容一模一樣但并非同一個(gè)】的對(duì)象。

????但是當(dāng)素體的生命周期即將結(jié)束的情況?對(duì)成員指針?biāo)笇?duì)象的重新構(gòu)造是不是顯得多余,畢竟一個(gè)生命周期即將結(jié)束的對(duì)象,它的成員是正經(jīng)對(duì)象也好是指針也好,我都應(yīng)該于情于理的予以釋放(比如在析構(gòu)函數(shù)中),數(shù)據(jù)還好,要是裸指針不釋放,得,那就是C與C++經(jīng)典的內(nèi)存泄漏問(wèn)題。

????然后你就發(fā)現(xiàn):臥槽,素體的指針都不要了,我為什么不拿來(lái)直接用?而是傻乎乎的付出巨大成本拷貝了一個(gè)后,還讓素體把它釋放了? 這個(gè)時(shí)候回想一下我先行的結(jié)論:

????將【移動(dòng)拷貝】當(dāng)做一個(gè)面向【即將消逝對(duì)象】的特化版【拷貝操作】

????一個(gè)類(lèi)擁有如此多的構(gòu)造函數(shù),本質(zhì)上就是擁有多個(gè)函數(shù)重載,能夠讓你使用不同的形參將對(duì)象構(gòu)造出來(lái),移動(dòng)拷貝也就是其中一個(gè)為了應(yīng)對(duì)【即將消逝對(duì)象】的函數(shù)重載罷了。

????于是就有了教科書(shū)般的移動(dòng)拷貝定義:

????就像淺拷貝似的,我拷貝對(duì)象直接把你素體的【數(shù)據(jù)的地址】拿來(lái),再把你素體的【數(shù)據(jù)的地址】改為空地址,這樣就不怕你在死的時(shí)候拉我想要的數(shù)據(jù)一起陪葬了。

????要知道,一般來(lái)說(shuō),如果一個(gè)類(lèi)內(nèi)有指針指向堆區(qū)資源,那么為了內(nèi)存不泄露,析構(gòu)函數(shù)就要對(duì)這些指針或者free,或者delete。(哪怕是智能指針,也是會(huì)以一種根據(jù)智能指針具體類(lèi)型的方式自動(dòng)釋放資源,這玩意有個(gè)學(xué)名,叫RAII)

????這樣之后,當(dāng)面對(duì)一個(gè)【我知道它命不久矣】的【素體對(duì)象】,我就有那么一個(gè)特化的【拷貝操作】,來(lái)用一個(gè)相對(duì)節(jié)約的方式將它拷貝出來(lái),這個(gè)過(guò)程就像是函數(shù)重載似的。

????在上述的例子里,為了解釋所謂【命不久矣的對(duì)象】,我們用函數(shù)返回值來(lái)說(shuō)明,函數(shù)的返回值必定是一個(gè)【命不久矣的對(duì)象或者變量】,但是我馬上就會(huì)在后面加入討論RVO的時(shí)候告訴你,函數(shù)返回值大多數(shù)情況下其實(shí)并不需要開(kāi)發(fā)者手動(dòng)來(lái)進(jìn)行不同構(gòu)造函數(shù)的調(diào)用。

????這個(gè)時(shí)候,就要補(bǔ)充一下,還記得我上面的紅字說(shuō)了什么嗎?

????但凡有一個(gè)拷貝,那么一個(gè)對(duì)象必須會(huì)產(chǎn)生。

????也就是說(shuō),拷貝對(duì)象的內(nèi)存空間說(shuō)什么都要被構(gòu)造出來(lái),這樣意味著:

????假如你的類(lèi)內(nèi)包含的不是指向堆區(qū)資源的指針,而是實(shí)打?qū)嵉臄?shù)據(jù),實(shí)打?qū)嵉膶?duì)象,那么這樣的拷貝過(guò)程右值拷貝是沒(méi)辦法進(jìn)行優(yōu)化的。

????除非:我不構(gòu)造拷貝對(duì)象了,我直接拿著素體用行不行?

????好了,從現(xiàn)在開(kāi)始,我們的討論就要帶著編譯器返回值優(yōu)化來(lái)進(jìn)行了,從此開(kāi)始也是此次更新的一部分新內(nèi)容。而這個(gè)部分從某種程度上說(shuō),也更像是我的effective modern C++的讀書(shū)筆記。

????編譯器返回值優(yōu)化便可以將【函數(shù)作用域內(nèi)臨時(shí)對(duì)象】的生命周期延長(zhǎng),直接將那個(gè)我們本來(lái)認(rèn)為【是臨時(shí)對(duì)象的對(duì)象】整個(gè)返回給你讓你用,而不是給你拷貝一個(gè)【以臨時(shí)對(duì)象為素體】的新對(duì)象,也是現(xiàn)代C++編譯器的強(qiáng)大之處所在。

????而我跟你說(shuō)了這么多右值拷貝的事,人家一個(gè)編譯器返回值優(yōu)化全搞定了,是不是就仿佛......我說(shuō)的話都好似放屁一般?

? ? 當(dāng)然不是,RVO只是在大多數(shù)情況下讓我們不用去考慮函數(shù)返回值的情況而已,記住,是大多數(shù)情況,而且還有很多情況需要你對(duì)移動(dòng)拷貝有一個(gè)理解甚至是能夠應(yīng)用。

????現(xiàn)代C++的編譯器是無(wú)比強(qiáng)大的,當(dāng)它遇到了一個(gè)函數(shù)返回的時(shí)候,會(huì)自行判斷它能不能進(jìn)行返回值優(yōu)化,而我們常年遇到的情況大多都是編譯器會(huì)幫我們進(jìn)行優(yōu)化的情況。

? ? 然后,我們就名正言順的應(yīng)當(dāng)直面一個(gè)問(wèn)題:編譯器會(huì)在什么時(shí)候進(jìn)行返回值優(yōu)化呢?

????effective modern C++在它的條款25提到(當(dāng)然這是作者引用的標(biāo)準(zhǔn)哈):
????1、局部對(duì)象和函數(shù)返回值類(lèi)型一樣的情況
????2、返回的就是局部對(duì)象本身

????本著標(biāo)準(zhǔn)肯定不會(huì)錯(cuò)的原則,其實(shí)就這么兩條,但是考慮到人人理解可能都有偏頗的事實(shí),有不少實(shí)際情況其實(shí)從我的思維上很難和這兩條對(duì)應(yīng)上。

????而且我更愿意將這兩條合并理解為:返回對(duì)象的數(shù)據(jù)類(lèi)型與函數(shù)返回?cái)?shù)據(jù)類(lèi)型一致。

????你可能需要稍微繞一繞,這個(gè)合并理解與第一條并不是完全一樣,而且除此之外

????我還要用我自己的理解來(lái)對(duì)這兩條進(jìn)行一下擴(kuò)充,這僅僅是個(gè)人理解,并非是權(quán)威資料。

????3、返回的對(duì)象不能是數(shù)組或是容器中的某一個(gè)元素
????4、返回按值傳遞的形參,形參與返回類(lèi)型相同(effective modern C++ 條款25)

????好,我用我的理解來(lái)歸并一下這幾條特例,應(yīng)該負(fù)責(zé)任的說(shuō),這只是我總結(jié)出來(lái)的,有不全面的可能性。

????1、返回對(duì)象的數(shù)據(jù)類(lèi)型與函數(shù)返回?cái)?shù)據(jù)類(lèi)型一致。
????2、返回的對(duì)象不能是數(shù)組或是容器中的某一個(gè)元素
????3、返回按值傳遞的形參,形參與返回類(lèi)型相同(effective modern C++ 條款25)

????接下來(lái)當(dāng)我說(shuō)第幾條的時(shí)候,都是以這個(gè)我歸納的三條來(lái)進(jìn)行說(shuō)明,或者我會(huì)顯式的稱(chēng)之為新三條的第幾條,如果是引用了更早的四條,我會(huì)說(shuō)老四條的第幾條。

? ? 考慮下面的例子,這個(gè)例子類(lèi)似于Effective Modern C++ 條款25給出的例子:

????這里的返回值不是局部對(duì)象tmp而是tmp的引用,這樣的情況是無(wú)法觸發(fā)編譯器返回值優(yōu)化的,這個(gè)例子書(shū)中給出的原因是【沒(méi)給返回局部對(duì)象本身】,屬于老四條的第二條。

????但結(jié)合我們歸并的新三條總結(jié)來(lái)看,返回值類(lèi)型要求是一個(gè)Data,而經(jīng)由std::move以后,返回對(duì)象則是Data&&,促成了函數(shù)返回值與返回對(duì)象的數(shù)據(jù)類(lèi)型不一致,進(jìn)而無(wú)法進(jìn)行RVO。

????但是,我負(fù)責(zé)任的告訴各位讀者,我自己做實(shí)驗(yàn)有個(gè)特例:

? ? 鉆牛角尖的說(shuō),這個(gè)情況是對(duì)不上新三條的第一條以及老四條的第一條的,因?yàn)榫植孔兞渴且粋€(gè)Data類(lèi)型,函數(shù)返回類(lèi)型是一個(gè)const Data,這是兩個(gè)不一樣的類(lèi)型。

????當(dāng)然,官方肯定有針對(duì)這個(gè)的說(shuō)法,只是我還沒(méi)有翻到相關(guān)的說(shuō)明,再加上它本身不是什么值得特別關(guān)注的點(diǎn),我也就不打算特地為這個(gè)翻閱資料,而是當(dāng)一個(gè)既成事實(shí)先記下來(lái)就行了。這個(gè)例子確實(shí)是能觸發(fā)RVO的。

????另外兩個(gè)例子很好理解,新三條的第3條你可能讀著稍微有點(diǎn)別扭,但如果我給出你如下的代碼,我相信你立刻就能理解:

? ? 仔細(xì)看看新三條的第一條對(duì)應(yīng)的代碼,如果足夠細(xì)心就會(huì)發(fā)現(xiàn),其實(shí)第一條和第二條是可以合并在一起的。因?yàn)榉祷財(cái)?shù)組中的某一個(gè)元素調(diào)用了operator[],這個(gè)運(yùn)算符返回的是一個(gè)引用,引用的數(shù)據(jù)類(lèi)型與函數(shù)返回值的數(shù)據(jù)類(lèi)型不一致,造成了編譯器并不會(huì)幫這段代碼進(jìn)行返回值優(yōu)化。

????以上就是我目前能夠想到的和總結(jié)出來(lái)的無(wú)法觸發(fā)RVO的情況,但你千萬(wàn)別跟我說(shuō)我沒(méi)算主動(dòng)關(guān)了RVO的情況,我覺(jué)得那個(gè)就純屬是在碰瓷了。

????我在開(kāi)始討論RVO的時(shí)候說(shuō)過(guò),函數(shù)返回值大多數(shù)情況下其實(shí)并不需要開(kāi)發(fā)者手動(dòng)來(lái)進(jìn)行不同構(gòu)造函數(shù)的調(diào)用。

????這句話的意思是:但凡出現(xiàn)要返回局部對(duì)象的情況,你不需要添加任何奇奇怪怪的操作,直接返回就好了。就比如,你不需要手動(dòng)為返回值加上std::move(),無(wú)論你是否清楚【當(dāng)前是一種不會(huì)觸發(fā)返回值優(yōu)化的情況】。

????因?yàn)榫幾g器本身會(huì)按著一套很理想的方案為你整合出最適合的方式:
????當(dāng)編譯器看到你的返回值是一個(gè)局部對(duì)象,它先會(huì)嘗試這能不能進(jìn)行RVO。
????如果不能,他就會(huì)嘗試進(jìn)行移動(dòng)拷貝,判斷依據(jù)就是返回對(duì)象所對(duì)應(yīng)類(lèi)型有沒(méi)有實(shí)現(xiàn)移動(dòng)拷貝構(gòu)造函數(shù)。
????再不能,才會(huì)是最差的情況,使用左值拷貝。
?

????或許哈,在函數(shù)返回值這個(gè)小小的點(diǎn)上討論移動(dòng)拷貝真就是放屁一樣,咱們講了那么多移動(dòng)語(yǔ)義的理論,但RVO幫咱們省了幾乎所有的事。

????但請(qǐng)記住,縱然有RVO來(lái)為我們進(jìn)行效率優(yōu)化,但移動(dòng)語(yǔ)義絕不是沒(méi)有價(jià)值的東西。

????且不說(shuō)我提到的幾種情況就無(wú)法觸發(fā)RVO,需要你自己去實(shí)現(xiàn)移動(dòng)拷貝構(gòu)造來(lái)進(jìn)行代碼效率上的優(yōu)化,在大環(huán)境里,我不信你碰不到那種【你需要將一個(gè)命不久矣的對(duì)象的資源過(guò)繼給一個(gè)新對(duì)象】的情況,要知道,所謂【命不久矣】的對(duì)象,可沒(méi)人說(shuō)只有所謂的函數(shù)作用域內(nèi)的臨時(shí)對(duì)象,這樣的家伙在編程乃至于內(nèi)存管理的世界里數(shù)不勝數(shù)。

????我給出一個(gè)一拍腦門(mén)想出來(lái)的案例:
????假設(shè)你需要一類(lèi)STL容器來(lái)存儲(chǔ)兩批數(shù)據(jù)。
????第一批是一套流水線下的所有產(chǎn)品抽象,我們稱(chēng)之為goods。
????另一批則是經(jīng)過(guò)質(zhì)檢后,從所有產(chǎn)品中監(jiān)測(cè)合格的合格產(chǎn)品,我們稱(chēng)之為hegede_goods,呸,不要這么命名,我們稱(chēng)之為qualified_goods。
????如果有一個(gè)功能為質(zhì)量檢測(cè)的函數(shù)接收兩個(gè)容器的引用,需要將goods容器內(nèi)的數(shù)據(jù)轉(zhuǎn)移至qualified_goods中。
????如此想來(lái),它是不是一個(gè)經(jīng)典的需要使用移動(dòng)語(yǔ)義的場(chǎng)景?

????但對(duì)于這些東西的追根問(wèn)底,就并不是我這篇文章打算討論的了,到此為止,文章的主要內(nèi)容以及更新內(nèi)容基本結(jié)束了。

???

?????結(jié)尾之際,我仍然想表示,上述的理解是我個(gè)人在查閱了資料,實(shí)驗(yàn)觀察結(jié)果后的個(gè)人總結(jié)。我和一些有經(jīng)驗(yàn)的朋友們交流過(guò),其中有和我擁有共識(shí)的,自然也有跟我產(chǎn)生分歧的。

????我在C++17的指南上找到了這么一句話當(dāng)對(duì)象有很多基本類(lèi)型的成員時(shí)移動(dòng)語(yǔ)義還是要拷貝每個(gè)成員】(既然說(shuō)到了C++17,我也補(bǔ)充一句,C++17中引入了std::data,所以各位小伙伴今后想給對(duì)象,尤其是可調(diào)用對(duì)象或是函數(shù)命名為data的時(shí)候,請(qǐng)三思而后行。)

????我個(gè)人感覺(jué),這句話可以為我的上述理解做解釋類(lèi)內(nèi)的成員若是基礎(chǔ)類(lèi)型或是非指針的數(shù)據(jù),那么右值拷貝不會(huì)帶來(lái)效率上的優(yōu)化

????細(xì)想一下,這兩個(gè)說(shuō)法是可以相互解釋的。無(wú)論你類(lèi)里放了什么數(shù)據(jù),這些數(shù)據(jù)都要拷貝,哪怕是指針在64位系統(tǒng)上也有8字節(jié),這些實(shí)打?qū)嵉臄?shù)據(jù)都會(huì)拷貝,省不了。不過(guò)是指針本身是一個(gè)儲(chǔ)存著地址的數(shù)據(jù),那個(gè)真實(shí)地址的內(nèi)存里,才存儲(chǔ)著可以拿來(lái)用的數(shù)據(jù)而已。

????default的移動(dòng)拷貝從結(jié)果上說(shuō),與左值引用拷貝的效果是完全一樣的,只是你沒(méi)有履行使用std::move的默認(rèn)規(guī)則——當(dāng)使用此函數(shù)傳遞某個(gè)對(duì)象以后,便認(rèn)定該對(duì)象死亡,不再訪問(wèn)和使用它。

????這個(gè)規(guī)矩你不遵守,當(dāng)然會(huì)有代碼規(guī)范上的缺憾甚至是未定義行為的產(chǎn)生,但實(shí)際上我沒(méi)有找到任何語(yǔ)法或是語(yǔ)義,能夠確實(shí)的將某塊內(nèi)存的數(shù)據(jù)【通過(guò)移動(dòng)的方式】(即在將內(nèi)存1的數(shù)據(jù)移動(dòng)到內(nèi)存2上以后,內(nèi)存1失效并被釋放到另一塊內(nèi)存上)。到頭來(lái),std::move和std::forward更多的是為了精準(zhǔn)調(diào)用參數(shù)為【右值引用】的函數(shù)重載罷了。這也正是標(biāo)題所說(shuō)的,移動(dòng)語(yǔ)義其實(shí)并沒(méi)有產(chǎn)生根本的移動(dòng)行為。

????所謂移動(dòng),更像是先拷貝再將【素體對(duì)數(shù)據(jù)的擁有權(quán)】【釋放】以產(chǎn)生出的一個(gè)移動(dòng)的感覺(jué)而已。這個(gè)清楚動(dòng)作是要經(jīng)開(kāi)發(fā)人員之手來(lái)實(shí)現(xiàn)的,不是C++自己的內(nèi)容,就像STL那樣,STL的開(kāi)發(fā)者在素體作為移動(dòng)構(gòu)造參數(shù)被訪問(wèn)時(shí)將其進(jìn)行【釋放自身對(duì)資源的擁有權(quán)】的操作。

????C++的體系如汪洋大海,很難由一個(gè)人徹底吃透,不同的開(kāi)發(fā)者擁有不同的觀念和理解屬于很正常的情況,而如果您跟我有歧義且自信能夠說(shuō)服我,歡迎私信或是評(píng)論區(qū)留言。

????如果你覺(jué)得我的文章對(duì)您有幫助,還希望我可以更新別的內(nèi)容,那么如果有機(jī)會(huì),我會(huì)在下一次為各位帶來(lái)如下內(nèi)容:
????深入淺出C++:完美轉(zhuǎn)發(fā)不完美

????最后,感謝您的閱讀。




深入淺出C++:移動(dòng)語(yǔ)義不移動(dòng)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
河间市| 张掖市| 加查县| 大英县| 岳池县| 钟祥市| 荃湾区| 方城县| 肇庆市| 肥乡县| 贡觉县| 博白县| 闵行区| 徐闻县| 桦川县| 宜宾市| 象山县| 新安县| 湄潭县| 得荣县| 瑞昌市| 华容县| 呈贡县| 肇源县| 祁阳县| 太白县| 盐城市| 克东县| 桂林市| 延安市| 通河县| 清徐县| 敖汉旗| 日照市| 湟中县| 巴林左旗| 渑池县| 吉林省| 新乡市| 同德县| 牙克石市|