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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++11如何减少内存拷贝次数

發(fā)布時(shí)間:2025/3/20 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11如何减少内存拷贝次数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  C++11中出現(xiàn)了很多迷人的特性。例如智能指針實(shí)現(xiàn)高效的內(nèi)存管理,std::bind和std::function函數(shù)封裝器,以及l(fā)ambda實(shí)現(xiàn)的函數(shù)對(duì)象語(yǔ)法糖,都是使我著迷的地方。

  而C++11最大的改動(dòng)則是移動(dòng)語(yǔ)義,考慮這么一個(gè)場(chǎng)景:將一個(gè)將亡對(duì)象A的內(nèi)容拷貝給另一個(gè)對(duì)象B,然后A對(duì)象被析構(gòu)釋放內(nèi)存,我們的程序使用B對(duì)象。這是經(jīng)常發(fā)生的事情,調(diào)用函數(shù)傳參或者函數(shù)返回值時(shí)最為常見。如果A和B對(duì)象占用的內(nèi)存非常多,則這個(gè)操作會(huì)導(dǎo)致大量?jī)?nèi)存的拷貝。

  為什么我們不直接將對(duì)象A的名字改成B呢?這樣就省去了拷貝內(nèi)存和析構(gòu)的時(shí)間,增加的只是重命名的時(shí)間,在對(duì)象所占內(nèi)存巨大時(shí)(例如對(duì)象是一個(gè)高度為1000的平衡二叉樹(std::map),每個(gè)節(jié)點(diǎn)又是一個(gè)龐大的自定義結(jié)構(gòu)體)。

  是的,為了這個(gè)目的,C++作出了很多的努力,引用傳參就能實(shí)現(xiàn)為對(duì)象取一個(gè)別名的作用,然而這一套別名系統(tǒng)必須保證原對(duì)象存在,如果原對(duì)象超出作用域被析構(gòu),則所有關(guān)于這個(gè)對(duì)象的別名都會(huì)立刻失效,這一個(gè)對(duì)象的持有者還是它自身,只是使用別名可以在對(duì)象存在期間引用它。

  想要改變持有者,則可以使用智能指針,多個(gè)指針同時(shí)持有一個(gè)對(duì)象,當(dāng)最后一個(gè)指針析構(gòu)時(shí)會(huì)將指向的對(duì)象析構(gòu),這使得對(duì)象可以被多個(gè)指針持有,這是智能指針與引用語(yǔ)法的一個(gè)區(qū)別,并且智能指針是靠庫(kù)實(shí)現(xiàn),而引用是靠語(yǔ)法支持。而智能指針有一個(gè)非常大的特點(diǎn),它有權(quán)力析構(gòu)對(duì)象,意味著它所指向的內(nèi)容必須是堆區(qū)內(nèi)容,而棧上的內(nèi)容則靠出棧時(shí)自動(dòng)析構(gòu)釋放內(nèi)存,如果你的大體積的對(duì)象是放在棧上,則使用智能指針是不行的。

  移動(dòng)語(yǔ)義的發(fā)明,就能解決這個(gè)問(wèn)題,不管發(fā)生棧上或者堆上 大體積對(duì)象的拷貝,就可以使用移動(dòng)語(yǔ)義,改變?cè)搶?duì)象的持有者,而不需要拷貝這塊內(nèi)存。還是最初 將亡值A(chǔ)拷貝到B的例子,依靠移動(dòng)語(yǔ)義,拷貝時(shí)使B指向A的內(nèi)容,然后A指向B的內(nèi)容(也就是交換內(nèi)容,注意這里的交換沒(méi)有發(fā)生大內(nèi)存拷貝,只是改變了指針的指向。)然后A對(duì)象釋放,我們接著使用B對(duì)象,B對(duì)象的內(nèi)容是A原來(lái)的內(nèi)容,而A對(duì)象析構(gòu)時(shí)將B對(duì)象原本要被覆蓋的內(nèi)容析構(gòu)掉,完美。

  C++從引用語(yǔ)法、智能指針類、移動(dòng)語(yǔ)義多個(gè)方面支持開發(fā)者減少內(nèi)存的拷貝,發(fā)揮出C++的性能威力。在設(shè)計(jì)良好的情況下,不會(huì)出現(xiàn)大內(nèi)存塊的拷貝。

?

轉(zhuǎn)載于:https://www.cnblogs.com/xjjsk/p/8952139.html

總結(jié)

以上是生活随笔為你收集整理的C++11如何减少内存拷贝次数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。