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

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

分享到微博請遵守國家法律
平阴县| 新乡县| 台山市| 黄平县| 万山特区| 大关县| 永川市| 和平区| 重庆市| 和田县| 永寿县| 潼南县| 赤峰市| 鄯善县| 富顺县| 肃宁县| 莎车县| 沐川县| 清苑县| 诸城市| 湖南省| 磐石市| 聂拉木县| 鹤山市| 辉县市| 德格县| 马鞍山市| 休宁县| 锦州市| 安龙县| 营口市| 东山县| 额济纳旗| 资中县| 宝兴县| 汉中市| 南汇区| 棋牌| 柞水县| 砚山县| 霸州市|