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

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)了類似的內(nèi)存管理機(jī)制。

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

我簡(jiǎn)單地畫了幅圖表示整個(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)客戶端請(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)客戶端歸還時(shí),allocator找到對(duì)應(yīng)的鏈表,將
內(nèi)存重新放回鏈表B即可。

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

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

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

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

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

唉 水已經(jīng)滿了 會(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)了解了,自己寫的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>的保存者分配其他類型的內(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類型的內(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>
            一本色道久久综合亚洲精品按摩| 亚洲欧美日韩国产| 午夜精品视频一区| 国产欧美在线| 日韩视频在线观看免费| 在线成人免费观看| 亚洲成色777777在线观看影院| 欧美不卡视频| 久久久青草青青国产亚洲免观| 欧美美女操人视频| 亚洲高清自拍| 国产精品一区二区三区免费观看 | 国内成人精品2018免费看| 女人色偷偷aa久久天堂| 午夜精品久久久久久久久 | 久久九九久精品国产免费直播| 日韩视频中文字幕| 久久久噜噜噜久久中文字免| 一区二区视频在线观看| 99精品视频免费观看视频| 亚洲精品午夜| 欧美日韩无遮挡| 好看的亚洲午夜视频在线| 亚洲影音先锋| 欧美午夜欧美| 性高湖久久久久久久久| 亚洲国产一区二区三区青草影视| 这里只有精品在线播放| 国产专区欧美专区| 欧美午夜电影在线观看| 久久亚洲精品伦理| 先锋影音久久久| 亚洲一区日韩在线| 亚洲清纯自拍| 欧美日韩网站| 国内精品美女在线观看| 欧美激情一区二区三区在线| 久久激情视频久久| 午夜精品美女自拍福到在线| 亚洲美女黄网| 一区二区精品在线观看| 亚洲精品一区二区三区婷婷月| 欧美a级片网| 欧美视频一区在线观看| 在线视频亚洲一区| 这里是久久伊人| 亚洲欧美三级伦理| 亚洲欧美清纯在线制服| 亚洲视频在线观看免费| 免费亚洲电影在线观看| 美女视频黄免费的久久| 中文精品99久久国产香蕉| 亚洲精品一级| 亚洲无限av看| 久久精品99无色码中文字幕| 久久久国产精品一区| 久久综合久久综合久久综合| 欧美电影免费观看大全| 欧美日韩色婷婷| 日韩视频专区| 午夜久久久久久| 蜜臀av一级做a爰片久久| 91久久夜色精品国产九色| 亚洲国产成人久久| 亚洲综合色在线| 猛干欧美女孩| 欧美视频中文字幕在线| 激情伊人五月天久久综合| 亚洲欧洲一区二区在线播放| 亚洲欧美色婷婷| 亚洲国产老妈| 久久女同互慰一区二区三区| 欧美日韩中国免费专区在线看| 黄色在线成人| 亚洲欧美日韩综合国产aⅴ| 欧美国产丝袜视频| 久久精品国产欧美亚洲人人爽| 欧美日韩精品一区视频 | 欧美日韩一区二区在线观看 | 欧美一区国产二区| 欧美成人视屏| 噜噜噜噜噜久久久久久91 | 久久久亚洲午夜电影| 99re6这里只有精品| 欧美精品久久天天躁| 日韩一区二区精品| 亚洲大胆人体在线| 久久精品国内一区二区三区| 国产综合久久| 久久久亚洲国产美女国产盗摄| 欧美一级夜夜爽| 在线日韩av片| 亚洲人成艺术| 国产精品www994| 欧美亚洲视频在线观看| 午夜在线播放视频欧美| 国产一区亚洲| 欧美 日韩 国产一区二区在线视频| 午夜精品福利视频| 国产日韩精品视频一区二区三区| 欧美一区不卡| 久久久蜜臀国产一区二区| 亚洲风情在线资源站| 亚洲国产精品专区久久| 国产精品国产亚洲精品看不卡15| 亚洲欧美日韩专区| 欧美福利在线| 精品电影在线观看| 亚洲第一页中文字幕| 欧美视频免费在线| 久久亚洲综合色一区二区三区| 免费成人av在线看| 性做久久久久久久久| 欧美国产日韩视频| 欧美日韩亚洲一区在线观看| 国产精品任我爽爆在线播放| 免费成人性网站| 国产毛片久久| 一区电影在线观看| 亚洲激情自拍| 久久久夜精品| 久久久久久夜| 国产欧美精品xxxx另类| 99精品视频免费观看| 99热精品在线| 欧美电影免费| 最新成人av在线| 99这里只有久久精品视频| 快射av在线播放一区| 久久一区二区三区四区| 国产精品一区二区三区免费观看| 亚洲精品国产拍免费91在线| 亚洲激情在线视频| 免费在线一区二区| 国产日韩欧美在线| 亚洲午夜精品福利| 亚洲一区高清| 国产日韩欧美综合一区| 亚洲欧美日韩综合国产aⅴ| 久久精品人人做人人爽电影蜜月| 国产精品亚洲不卡a| 午夜在线播放视频欧美| 欧美成人国产| 免费中文日韩| 日韩午夜av电影| 午夜久久黄色| 亚洲黄色一区二区三区| 欧美日韩在线不卡一区| 99精品99| 亚洲综合社区| 国产亚洲精品aa| 久久国产日韩欧美| 国产欧美精品国产国产专区| 久久这里只有精品视频首页| 日韩午夜黄色| 久久久夜精品| 午夜精品久久| 一本色道久久综合| 国产主播一区| 国产伦精品一区二区三区高清版| 久久久久看片| 亚洲男人第一av网站| 美女主播一区| 欧美专区第一页| 亚洲午夜一二三区视频| 亚洲电影免费观看高清完整版在线观看| 欧美激情精品久久久| 久久精品99| 欧美一二三区在线观看| 亚洲一区二区三区在线播放| 亚洲国产合集| 久久影视精品| 欧美一区二区三区免费在线看| 一区二区欧美亚洲| 99国产精品自拍| 一区二区国产日产| 亚洲一级黄色| 欧美一区二区视频在线| 午夜亚洲福利在线老司机| 亚洲欧美日韩久久精品| 欧美在线免费视频| 久久久久久穴| 欧美高清在线视频观看不卡| 亚洲第一黄网| 一本大道久久a久久综合婷婷| 亚洲精品乱码久久久久| 99xxxx成人网| 久久黄色影院| 欧美日本一道本| 国产精品国产三级国产普通话三级| 国产精品va在线播放| 韩日午夜在线资源一区二区| 亚洲国产精品尤物yw在线观看| 日韩午夜激情av| 久久国产精品一区二区三区四区 | 亚洲欧美清纯在线制服| 亚洲免费视频在线观看| 久久久成人精品| 一本色道久久综合狠狠躁篇的优点 | 亚洲福利电影|