空間配置器

2.空間配置器

2.1具備次配置力(sub-allocation)的SGI空間配置器

SGI含有兩個空間配置器類填硕,std::allocator內(nèi)存分配類符合標準麦萤,但是僅僅是對operator new和operator delete簡單封裝一下而已;其次是SGI特殊的內(nèi)存分配器std::alloc,其中實現(xiàn)采用了內(nèi)存池扁眯,對于分配大量小容量的對象壮莹,可以大大減少內(nèi)存碎片。


SGI標準的空間配置器std::allocator

這是對應的模板內(nèi)聯(lián)內(nèi)存分配函數(shù)恋拍。實現(xiàn)起來也很簡單垛孔,注意這里分配的內(nèi)存僅僅是一塊沒有使用的空間而已,在上面并沒有構(gòu)造對象施敢,后面講解如何在上面構(gòu)造對象周荐。

模板內(nèi)聯(lián)內(nèi)存釋放函數(shù),直接調(diào)用全局的operator delete釋放對應的內(nèi)存僵娃。

SGI特殊的空間配置器Std::alloc

class Foo{…}

Foo* pf = new Foo;//配置內(nèi)存概作,然后構(gòu)造對象

delete pf;//將對象析構(gòu),然后釋放內(nèi)存


new的算是包含兩個階段:

1)? 調(diào)用::operator new 配置內(nèi)存

2)? 調(diào)用Foo::Foo()構(gòu)造對象內(nèi)容

Delete算式也包含兩個階段

1)? 調(diào)用Foo::~Foo()將對象析構(gòu)

2)調(diào)用::operator delete釋放內(nèi)存


為了精密分工默怨,STL allocator將兩個階段的操作分開來讯榕,內(nèi)存配置操作由alloc::allocate()負責,內(nèi)存釋放操作由alloc::deallocate()負責;對象構(gòu)造由::construct()負責愚屁,對象析構(gòu)由::destroy()負責济竹。


2.stl_alloc.h 內(nèi)存空間的分配和釋放

內(nèi)部使用malloc在堆中申請內(nèi)存,其中制造了一個內(nèi)存池霎槐,可以減少小型區(qū)塊過多而造成的內(nèi)存碎片問題送浊。

SGI設計了雙層級配置器,第一級配置器直接使用malloc()和free()丘跌,第二級配置器則視情況采用不同的策略:當配置區(qū)塊超過128bytes時袭景,采用第一級配置器,當配置區(qū)塊小于128bytes時闭树,采用第二級配置器耸棒,采用復雜的memory pool。它內(nèi)存池實際上就是內(nèi)部維護了16個自由鏈表报辱,預先已經(jīng)分配好了与殃,當需要從內(nèi)存池中取內(nèi)存時候,直接從對應鏈表取出即可捏肢;當釋放內(nèi)存到內(nèi)存池時候奈籽,直接將內(nèi)存插入鏈表即可。每個鏈表中節(jié)點分別占用8鸵赫、16衣屏、24、32辩棒、40狼忱、48、52一睁、64钻弄、72、80者吁、88窘俺、96、104复凳、112瘤泪、120、128字節(jié)育八。




舉例:



2.2 內(nèi)存操作全局函數(shù)


1对途、uninitialized_copy

將迭代器[first ,

last)范圍內(nèi)的內(nèi)容拷貝到result指定的區(qū)域。如果first是char 或wchar 那么直接使用memmove拷貝即可髓棋,如果first不是上述類型实檀,則通過辨別是否是POD類型來選擇構(gòu)造函數(shù)或者copy拷貝惶洲。



uninitialized_copy使我們能夠?qū)?nèi)存的配置和對象的構(gòu)造行為分離。


2膳犹、uninitialized_fill

將[first , last)迭代器指定范圍的內(nèi)存恬吕,通過x初始化。換句話說镣奋,該函數(shù)會針對操作范圍內(nèi)的每個迭代器i币呵,調(diào)用construct(&*I,x),在i所指之處產(chǎn)生x的復制品。與uninitialied_copy()一樣侨颈,該函數(shù)具備“commit or rollback”語義,要么產(chǎn)生所有必要元素芯义,要么不產(chǎn)生任何元素哈垢。如果任何一個copy constructor丟出異常(exception),該函數(shù)能夠?qū)⒁旬a(chǎn)生的所有元素析構(gòu)掉扛拨。


3耘分、uninitialized_fill_n

將[first , first+n)范圍內(nèi)的每一個迭代器都設定為x,總共設定了n個绑警,當是pod類型求泰,則直接拷貝x到指定的迭代器,不是pod類型计盒,那么在每一個迭代器上以x為初值進行構(gòu)造渴频。

上述是uninitialized_fill_n對應的簡單函數(shù)調(diào)用關系,重點在于理解POD類型北启。POD意思就是Plain

Old Data卜朗,也就是標量類型以及傳統(tǒng)的C struct類型。POD類型必須含有無用的構(gòu)造函數(shù)咕村、析構(gòu)函數(shù)场钉、拷貝構(gòu)造、賦值運算符函數(shù)懈涛。因此堆POD類型可以直接進行字節(jié)拷貝初始化逛万,而非POD類型采用最安全的做法,也就是通過對應的構(gòu)造函數(shù)初始化批钠。



總結(jié)圖:三個內(nèi)存基本函數(shù)的泛型版本與特化版本


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宇植,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子价匠,更是在濱河造成了極大的恐慌当纱,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踩窖,死亡現(xiàn)場離奇詭異坡氯,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門箫柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來手形,“玉大人,你說我怎么就攤上這事悯恍】饪罚” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵涮毫,是天一觀的道長瞬欧。 經(jīng)常有香客問我,道長罢防,這世上最難降的妖魔是什么艘虎? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咒吐,結(jié)果婚禮上野建,老公的妹妹穿的比我還像新娘。我一直安慰自己恬叹,他們只是感情好候生,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绽昼,像睡著了一般唯鸭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绪励,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天肿孵,我揣著相機與錄音,去河邊找鬼疏魏。 笑死停做,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的大莫。 我是一名探鬼主播蛉腌,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只厘!你這毒婦竟也來了烙丛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤羔味,失蹤者是張志新(化名)和其女友劉穎河咽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赋元,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡忘蟹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年飒房,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚值。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狠毯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褥芒,到底是詐尸還是另有隱情嚼松,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布锰扶,位于F島的核電站献酗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坷牛。R本人自食惡果不足惜凌摄,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漓帅。 院中可真熱鬧,春花似錦痴怨、人聲如沸忙干。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐迫。三九已至,卻和暖如春爱葵,著一層夾襖步出監(jiān)牢的瞬間施戴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工萌丈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赞哗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓辆雾,卻偏偏與公主長得像肪笋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子度迂,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353