五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

C++知識分享:如何在已分配的內(nèi)存上構(gòu)造對象?

2022-01-19 18:31 作者:C語言編程__Plus  | 我要投稿

為了提高程序的性能,一個做法是一次性分配足夠多的內(nèi)存,從而避免多次申請以及數(shù)據(jù)拷貝。對于c++,有一個問題:如何在已分配好的內(nèi)存上構(gòu)造對象?


小伙伴提到使用reserve預(yù)先分配內(nèi)存,再push_back或emplace_back,存儲過萬個大對象時可極大提升效率。探究其實現(xiàn)原理,會發(fā)現(xiàn)分配內(nèi)存簡單,調(diào)用標(biāo)準(zhǔn)庫或者nedmalloc、tcmalloc等庫中的函數(shù)即可;有了內(nèi)存,問題同樣變成如何在已分配的內(nèi)存上構(gòu)造對象?

方案

有兩種解決方案解決這個問題。

(1)placement new

第一種方案是使用placement?new。其用法過程為:首先分配足夠大的內(nèi)存;然后用placement?new語法生成對象:new(ptr)?xxx(),其中ptr是足夠容納所指對象的指針。

一個使用例子:

使用placement?new有三個注意點:一是要有足夠的內(nèi)存放置對象,這是必須的;二是指針應(yīng)該是“對齊”的,例如對于4字節(jié)對齊的系統(tǒng),指針地址應(yīng)該是4的整數(shù)倍;三是你(可能)需要顯式調(diào)用析構(gòu)函數(shù)完成對象的銷毀。

(2)operator new

使用new生成對象實際上執(zhí)行了三個操作:

①調(diào)用operator?new分配內(nèi)存

②調(diào)用類的構(gòu)造函數(shù)

③返回指針

其中operator?new是可重載的,無論全局還是特定類。其函數(shù)原型為:

回到把對象在指定內(nèi)存上構(gòu)造的問題上,我們可以通過重載operator?new,返回已分配內(nèi)存的指針。然而由于operator?new函數(shù)只接受一個參數(shù),地址指針需要是“全局”變量才能生效。這樣想來,這種方案實用性并不高。

其他

如果你希望像vector中的reserve先分配內(nèi)存,然后在其上裝載對象,可以使用allocator。allocator定義在頭文件中,能對指定類型分配合適的內(nèi)存,并可手動調(diào)用對象的構(gòu)造函數(shù)和析構(gòu)函數(shù)。

用法示例:

對于可以內(nèi)部管理的情形,建議使用allocator而非placement?new。

作用

為什么有這個需求呢?個人覺得有三方面的原因:

像vector的reserve,預(yù)先分配內(nèi)存可大幅提高性能;

重復(fù)利用已分配好的空間,避免內(nèi)存碎片;

細(xì)粒度進(jìn)行內(nèi)存管理,例如能夠?qū)崿F(xiàn)許多虛擬機(jī)中的將內(nèi)存數(shù)據(jù)從一個片區(qū)轉(zhuǎn)移到另一個片區(qū)(垃圾回收時觸發(fā))。

寫在最后:對于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

微信公眾號:C語言編程學(xué)習(xí)基地

C語言零基礎(chǔ)入門教程(83集全)

整理分享(多年學(xué)習(xí)的源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!



C++知識分享:如何在已分配的內(nèi)存上構(gòu)造對象?的評論 (共 條)

分享到微博請遵守國家法律
大渡口区| 济源市| 忻州市| 台东县| 松潘县| 河北区| 南康市| 蒙城县| 晋州市| 锡林浩特市| 定陶县| 隆安县| 临沭县| 宣城市| 柏乡县| 潼南县| 沅江市| 银川市| 隆化县| 久治县| 石阡县| 南京市| 武清区| 尼木县| 青浦区| 藁城市| 清水县| 宣化县| 马山县| 宁蒗| 霸州市| 梨树县| 兴和县| 昂仁县| 大安市| 上杭县| 东兴市| 高尔夫| 正宁县| 临朐县| 西吉县|