无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(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)造對象?的評論 (共 條)

分享到微博請遵守國家法律
始兴县| 宜章县| 吉林市| 五家渠市| 山西省| 万全县| 安平县| 云浮市| 鹿邑县| 龙江县| 靖宇县| 灵丘县| 贺兰县| 蒲江县| 柘城县| 土默特左旗| 河南省| 临汾市| 蒲城县| 河源市| 肇源县| 宾川县| 莱州市| 桓仁| 鹤山市| 泸水县| 大石桥市| 怀安县| 定结县| 临高县| 宣化县| 宝坻区| 武鸣县| 依安县| 惠来县| 车险| 卢氏县| 东乌| 保靖县| SHOW| 宁波市|