青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

SGI STL的內(nèi)存池

stl中各種容器都有一個(gè)可選的模板參數(shù):allocator,也就是一個(gè)負(fù)責(zé)內(nèi)存分配的組件。STL標(biāo)準(zhǔn)規(guī)定的allcator
被定義在memory文件中。STL標(biāo)準(zhǔn)規(guī)定的allocator只是單純地封裝operator new,效率上有點(diǎn)過(guò)意不去。

SGI實(shí)現(xiàn)的STL里,所有的容器都使用SGI自己定義的allocator。這個(gè)allocator實(shí)現(xiàn)了一個(gè)small object的內(nèi)存池。
Loki里為了處理小對(duì)象的內(nèi)存分配,也實(shí)現(xiàn)了類(lèi)似的內(nèi)存管理機(jī)制。

該內(nèi)存池大致上,就是一大塊一大塊地從系統(tǒng)獲取內(nèi)存,然后將其分成很多小塊以鏈表的形式鏈接起來(lái)。其內(nèi)部
有很多不同類(lèi)型的鏈表,不同的鏈表維護(hù)不同大小的內(nèi)存塊。每一次客戶(hù)端要求分配內(nèi)存時(shí),allcator就根據(jù)請(qǐng)求
的大小找到相應(yīng)的鏈表(最接近的尺寸),然后從鏈表里取出內(nèi)存。當(dāng)客戶(hù)端歸還內(nèi)存時(shí),allocator就將這塊內(nèi)存
放回到對(duì)應(yīng)的鏈表里。

我簡(jiǎn)單地畫(huà)了幅圖表示整個(gè)結(jié)構(gòu):

allocator

allocator內(nèi)部維護(hù)一個(gè)鏈表數(shù)組,數(shù)組元素全部是鏈表頭指針。鏈表A每一個(gè)節(jié)點(diǎn)維護(hù)一個(gè)8bytes的內(nèi)存塊,鏈表
B每一個(gè)節(jié)點(diǎn)維護(hù)一個(gè)16bytes的內(nèi)存塊。

當(dāng)客戶(hù)端請(qǐng)求分配10bytes的內(nèi)存時(shí),allocator將10調(diào)整為最接近的16bytes(只能大于10bytes),然后發(fā)現(xiàn)16bytes
這個(gè)鏈表(鏈表B)里有可用內(nèi)存塊,于是從B里取出一塊內(nèi)存返回。當(dāng)客戶(hù)端歸還時(shí),allocator找到對(duì)應(yīng)的鏈表,將
內(nèi)存重新放回鏈表B即可。

大致過(guò)程就這么簡(jiǎn)單,也許有人要說(shuō)用鏈表維護(hù)一塊內(nèi)存,鏈表本身就會(huì)浪費(fèi)一些內(nèi)存(在我很早前接觸內(nèi)存池時(shí),
總會(huì)看到類(lèi)似的論點(diǎn)= =|),其實(shí)通過(guò)一些簡(jiǎn)單的技巧是完全可以避免的。例如,這里allocator維護(hù)了很多內(nèi)存塊,
反正這些內(nèi)存本身就是閑置的,因此我們就可以直接在這些內(nèi)存里記錄鏈表的信息(下一個(gè)元素)。

還是寫(xiě)點(diǎn)代碼詳細(xì)說(shuō)下這個(gè)小技巧:

   

struct Obj
    
{
        Obj 
*next;
    }


    
void *mem = malloc( 100 );
    Obj 
*header = (Obj*) mem;
    Obj 
*cur_obj = header;
    Obj 
*next_obj = cur_obj;
    
forint i = 0; ; ++ i )
    
{
        cur_obj 
= next_obj;
        next_obj 
= (Obj*)((char*)next_obj + 10 );
        
if( i == 9 )
        
{
            cur_obj
->next = 0;
            
break;
        }

        
else
        
{
            cur_obj
->next = next_obj;
        }

    }

    free( mem );

 

這樣,通過(guò)header指針和next域,就可以逐塊(這里是10byts)地訪問(wèn)mem所指向的內(nèi)存,而這些鏈表的節(jié)點(diǎn),都
是直接保存在這塊內(nèi)存里的,所以完全沒(méi)有額外消耗。

我用C模仿著SGI的這個(gè)allocator寫(xiě)了個(gè)可配置的內(nèi)存池,在其上按照STL的標(biāo)準(zhǔn)包裝了一個(gè)allocator,可以直接
用于VC自帶的STL里。
測(cè)試代碼稍微測(cè)試了下,發(fā)現(xiàn)在不同的機(jī)器上有明顯的差距。

posted on 2008-06-12 21:26 Kevin Lynx 閱讀(8062) 評(píng)論(10)  編輯 收藏 引用 所屬分類(lèi): c/c++game develop通用編程

評(píng)論

# re: SGI STL的內(nèi)存池 2008-06-12 22:31 陳梓瀚(vczh)

我自己也曾經(jīng)做過(guò)一個(gè)內(nèi)存池,方法沒(méi)去比較不知道如何。

我的內(nèi)存池是一個(gè)模板,專(zhuān)門(mén)用于產(chǎn)生特定類(lèi)型的對(duì)象。因此構(gòu)造函數(shù)讓人制定一次創(chuàng)建的Buffer的尺寸。然后使用平衡樹(shù)組織了一個(gè)不可變大小的池從而獲得一個(gè)可變大小的池。平衡樹(shù)的比較由池之間的起始指針的比較結(jié)果決定,于是尋找一個(gè)指針屬于哪個(gè)池也比較快。Buffer的尺寸可以根據(jù)實(shí)際需要調(diào)整,我用這個(gè)池實(shí)現(xiàn)自己的Yacc的時(shí)候,發(fā)現(xiàn)平衡樹(shù)最多就三個(gè)節(jié)點(diǎn),不過(guò)文法數(shù)量也不多,僅有100條,不能當(dāng)壓力測(cè)試看待。

每一個(gè)固定尺寸的池還有一個(gè)可變長(zhǎng)度實(shí)現(xiàn)的堆棧,用于存放空閑位置。這樣的話從一個(gè)固定尺寸的池獲取和刪除都是O(1)。

空間浪費(fèi)在平衡樹(shù)和這個(gè)空閑索引堆棧了。  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池[未登錄](méi) 2008-06-12 22:52 CppExplore

唉 水已經(jīng)滿(mǎn)了 會(huì)錯(cuò)過(guò)很多東西的  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2008-06-13 10:41 關(guān)中刀客

以前我也試著這樣子去造個(gè)輪子,但是到最后發(fā)現(xiàn)沒(méi)有必要,STL這個(gè)就是一個(gè)free-list,但是如果你的這個(gè)用在多線程中就很崩潰的,你想想,不同的桶都有自己的一個(gè)瑣,這樣子瑣就會(huì)很多,另外增加了復(fù)雜度還不討好,除非在很關(guān)鍵的地方我使用我的內(nèi)存管理器,其他的地方還是stl吧  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2008-06-13 12:36 Kevin Lynx

@關(guān)中刀客
STL默認(rèn)那個(gè)內(nèi)存池。。。STL默認(rèn)沒(méi)內(nèi)存池。SGI的STL里那個(gè)內(nèi)存池不是標(biāo)準(zhǔn)的。VC下的STL就沒(méi)這個(gè)。  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2008-06-14 00:11 Gohan

終于對(duì)allocator有一點(diǎn)了解了,自己寫(xiě)的allocator里面放的內(nèi)存池結(jié)構(gòu)也可以用C++封裝吧?還有allocator中的rebind結(jié)構(gòu)是干什么用的呢?
  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2008-06-15 09:40 Kevin Lynx

@Gohan
rebind可以讓allocator<Tp>的保存者分配其他類(lèi)型的內(nèi)存。例如,當(dāng)實(shí)例化list時(shí)(例如list<int,my_allocator<int> > ),在list內(nèi)部就保存著一個(gè)my_allocator<int>,但是list需要為自己分配list_node,就是說(shuō)它需要另一個(gè)allocator,那么這個(gè)時(shí)候就可以通過(guò)rebind來(lái)完成。  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2008-06-15 12:51 Gohan

@Kevin Lynx
明白了,容器根據(jù)模板參數(shù)Alloc,可以用Alloc::rebind<list_node>::other這樣就能得到一個(gè)list_node類(lèi)型的內(nèi)存分配對(duì)象了吧,多謝指點(diǎn)  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2008-06-23 17:27 Bugs

很好;)  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2009-09-08 18:17 Ericxiao

既然要這樣設(shè)計(jì),那為何不直接使用數(shù)組呢?  回復(fù)  更多評(píng)論   

# re: SGI STL的內(nèi)存池 2009-12-02 10:07 dpslaile

有個(gè)疑問(wèn),如果創(chuàng)建很多個(gè)map,list,是否只能用同一個(gè)內(nèi)存池?
可以各個(gè)map對(duì)應(yīng)不同的內(nèi)存池嗎?  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清在线视频| 国内精品久久久久影院薰衣草| 亚洲国产精品一区二区尤物区| 午夜欧美大尺度福利影院在线看 | 久久人人看视频| 小处雏高清一区二区三区| 午夜欧美精品| 久久亚洲精品伦理| 免费亚洲视频| 欧美日韩免费一区二区三区视频| 欧美日韩一区在线| 国产精品视频区| 一区二区毛片| 亚洲欧美日韩视频二区| 欧美在线国产| 欧美激情一区二区三区蜜桃视频 | 亚洲欧美中文日韩v在线观看| 午夜亚洲福利| 麻豆国产精品777777在线| 亚洲国产精品久久久久秋霞影院 | 国产精品久久久久婷婷| 国产一在线精品一区在线观看| 在线精品视频一区二区| 一区二区欧美在线| 久久亚洲精品伦理| 日韩一区二区精品葵司在线| 性欧美暴力猛交69hd| 欧美电影在线免费观看网站| 国产欧美日韩视频| 日韩亚洲欧美高清| 久久久夜夜夜| 日韩亚洲欧美成人一区| 久久亚洲春色中文字幕久久久| 国产精品爱啪在线线免费观看| 亚洲国产精品欧美一二99| 欧美一区二区久久久| 亚洲国产欧洲综合997久久| 西瓜成人精品人成网站| 欧美久久成人| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美日韩一区二区在线| 亚洲黄色av| 美女福利精品视频| 狠狠综合久久av一区二区老牛| 亚洲午夜激情| 亚洲黄色精品| 美女黄网久久| 亚洲第一精品福利| 久久综合图片| 欧美一区国产二区| 国产一区二区精品久久99| 亚洲自拍另类| 在线视频欧美一区| 国产精品高潮呻吟久久av黑人| 夜夜狂射影院欧美极品| 亚洲福利电影| 免费在线日韩av| 亚洲国产成人精品久久久国产成人一区| 欧美专区在线观看| 亚洲欧美在线磁力| 国产一区二区日韩精品| 欧美在线观看日本一区| 亚洲欧美日韩高清| 国产日本欧美一区二区三区| 欧美一区二区三区啪啪| 久久国产欧美| 亚洲一区二区三区激情| 国产精品国产福利国产秒拍| 一本色道久久综合亚洲精品高清 | 久久精品日韩| 黄色在线一区| 免费观看成人网| 老司机午夜精品视频| 亚洲国产日本| 亚洲精品在线视频| 国产精品草莓在线免费观看| 午夜日韩在线| 久久久久久国产精品一区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲丶国产丶欧美一区二区三区 | 欧美男人的天堂| 亚洲淫片在线视频| 欧美一级大片在线观看| 在线视频国内自拍亚洲视频| 亚洲三级影片| 国产美女精品一区二区三区| 久久久久免费观看| 欧美**字幕| 亚洲欧美一区二区激情| 欧美在线看片| 99视频国产精品免费观看| 亚洲一区二区精品在线观看| 精品不卡一区二区三区| 亚洲麻豆视频| 激情av一区| 一区二区三区国产盗摄| 黑人中文字幕一区二区三区| 亚洲精品女人| 国产精品进线69影院| 久久综合中文| 国产精品成人一区| 欧美成人dvd在线视频| 欧美日韩直播| 麻豆av一区二区三区久久| 欧美日韩久久精品| 蜜桃伊人久久| 国产伦精品一区二区三区免费 | 国产丝袜美腿一区二区三区| 欧美激情日韩| 国产亚洲欧美aaaa| 亚洲美女毛片| 亚洲国产精品高清久久久| 亚洲一区免费看| 99精品久久久| 久色成人在线| 久久婷婷综合激情| 欧美性猛交视频| 欧美激情在线观看| 狠狠入ady亚洲精品经典电影| 亚洲无亚洲人成网站77777 | 国产精品婷婷| 日韩视频欧美视频| 亚洲电影毛片| 欧美伊人久久久久久午夜久久久久| 亚洲美女在线视频| 久久精品亚洲一区二区三区浴池| 亚洲综合欧美| 欧美三级免费| 日韩亚洲视频| 一本久久精品一区二区| 免费成人激情视频| 欧美成人免费小视频| 国产亚洲欧美一区在线观看| 中文在线资源观看网站视频免费不卡| 亚洲人成免费| 欧美成人性网| 亚洲精品永久免费精品| 9人人澡人人爽人人精品| 欧美高清一区二区| 亚洲国产91精品在线观看| 亚洲电影在线看| 久久天天躁狠狠躁夜夜爽蜜月| 久久精品主播| 狠狠色狠狠色综合日日小说| 久久都是精品| 免费在线成人av| 亚洲片区在线| 欧美岛国激情| 99视频一区| 欧美一级专区| 国产自产精品| 男人天堂欧美日韩| 亚洲免费成人| 欧美一级电影久久| 国产一区二区三区高清播放| 久久精品女人的天堂av| 欧美阿v一级看视频| 国产精品99久久不卡二区| 一区二区毛片| 国产精品午夜在线| 久久国产福利国产秒拍| 另类激情亚洲| 亚洲免费成人av| 国产精品毛片高清在线完整版| 午夜日本精品| 亚洲国产精彩中文乱码av在线播放| 亚洲精品一区二区网址 | 久久久福利视频| 亚洲第一精品电影| 一本色道久久综合精品竹菊| 国产精品家教| 美女精品网站| 亚洲欧美一区二区三区久久| 欧美fxxxxxx另类| 亚洲图中文字幕| 狠狠入ady亚洲精品| 欧美日韩国产首页| 久久激情一区| 99riav国产精品| 麻豆国产精品va在线观看不卡| 亚洲视频图片小说| 伊人久久婷婷| 国产精品国产三级国产专播精品人 | 国产原创一区二区| 欧美大片专区| 久久福利精品| 亚洲视频综合| 亚洲国产成人一区| 久久久久综合| 午夜精品久久久久久 | 久久九九精品| 国产精品99久久久久久白浆小说| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美激情四色 | 亚洲香蕉视频| 亚洲精品美女久久久久| 麻豆91精品| 久久久久久久久一区二区| 亚洲图片自拍偷拍| 亚洲免费av网站|