溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

空間配置器

發(fā)布時(shí)間:2020-07-27 04:18:46 來源:網(wǎng)絡(luò) 閱讀:278 作者:xiexiankun 欄目:編程語言

1. 空間配置器:內(nèi)存池實(shí)現(xiàn)小塊內(nèi)存分配,對(duì)應(yīng)到設(shè)計(jì)模式--單例模式(工具類,提供服務(wù),一個(gè)程序只需要一個(gè)空間配置器即可),享元模式(小塊內(nèi)存統(tǒng)一由內(nèi)存池進(jìn)行管理)

2.迭代器:迭代器模式,模板方法

3.容器:STL的核心之一,其他組件圍繞容器進(jìn)行工作:迭代器提供訪問方式,空間配置器提供容器內(nèi)存分配,算法對(duì)容器中數(shù)據(jù)進(jìn)行處理,仿函數(shù)偽算法提供具體的策略,類型萃取  實(shí)現(xiàn)對(duì)自定義類型內(nèi)部類型提取。保證算法覆蓋性。其中涉及到的設(shè)計(jì)模式:組合模式(樹形結(jié)構(gòu)),門面模式(外部接口提供),適配器模式(stack,queue通過deque適配得  到),建造者模式(不同類型樹的建立過程)。

4.類型萃?。夯诜缎途幊痰膬?nèi)部類型解析,通過typename獲取。可以獲取迭代器內(nèi)部類型value_type,Poter,Reference等。

5.仿函數(shù):一種類似于函數(shù)指針的可回調(diào)機(jī)制,用于算法中的決策處理。涉及:策略模式,模板方法。

6適配器:STL中的stack,queue通過雙端隊(duì)列deque適配實(shí)現(xiàn),map,set通過RB-Tree適配實(shí)現(xiàn)。涉及適配器模式。

關(guān)于六大組件之間的具體關(guān)系如圖簡單描述

空間配置器

ps(圖技術(shù)比較水,見諒,如有bug,請(qǐng)指正)

 

貌似扯的多了,來談?wù)勚黝}《空間配置器》問題吧。

STL空間配置器產(chǎn)生的緣由:

  在軟件開發(fā),程序設(shè)計(jì)中,我們不免因?yàn)槌绦蛐枨?,使用很多的小塊內(nèi)存(基本類型以及小內(nèi)存的自定義類型)。在程序中動(dòng)態(tài)申請(qǐng),釋放。

這個(gè)過程過程并不是一定能夠控制好的,于是乎,

問題1:就出現(xiàn)了內(nèi)存碎片問題。(ps外碎片問題)

問題2:一直在因?yàn)樾K內(nèi)存而進(jìn)行內(nèi)存申請(qǐng),調(diào)用malloc,系統(tǒng)調(diào)用產(chǎn)生性能問題。

注:內(nèi)碎片:因?yàn)閮?nèi)存對(duì)齊/訪問效率(CPU取址次數(shù))而產(chǎn)生 如 用戶需要3字節(jié),實(shí)際得到4或者8字節(jié)的問題,其中的碎片是浪費(fèi)掉的。

  外碎片:系統(tǒng)中內(nèi)存總量足夠,但是不連續(xù),所以無法分配給用戶使用而產(chǎn)生的浪費(fèi)。下邊簡單圖解

空間配置器

這兩個(gè)問題解釋清楚之后,就來談STL空間配置器的實(shí)現(xiàn)細(xì)節(jié)了

實(shí)現(xiàn)策略

  用戶申請(qǐng)空間大于128?

  yes:調(diào)用一級(jí)空間配置器

  no:調(diào)用二級(jí)空間配置器

大致實(shí)現(xiàn)為:

  二級(jí)空間配置由內(nèi)存池以及伙伴系統(tǒng):自由鏈表組成

  一級(jí)空間配置器直接封裝malloc,free進(jìn)行處理,增加了C++中的set_handler機(jī)制(這里其實(shí)也就是個(gè)略顯牽強(qiáng)的裝飾/適配模式了),增加內(nèi)存分配時(shí)客戶端可選處理機(jī)制。

可配置性:

  客戶端可以通過宏__USE_MALLOC進(jìn)行自定義選擇是否使用二級(jí)空間配置器。

一級(jí)空間配置器就主要封裝malloc,添加handler機(jī)制了,這里就不羅嗦了,相信各位都是可以通過源碼了解到的

關(guān)于二級(jí)空間配置器:

空間配置器


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI