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

loop_in_codes

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

SGI STL的內(nèi)存池

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

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

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

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

allocator

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

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

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

還是寫點代碼詳細說下這個小技巧:

   

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 );

 

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

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

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

評論

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

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

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

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

空間浪費在平衡樹和這個空閑索引堆棧了。  回復  更多評論   

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

唉 水已經(jīng)滿了 會錯過很多東西的  回復  更多評論   

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

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

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

@關中刀客
STL默認那個內(nèi)存池。。。STL默認沒內(nèi)存池。SGI的STL里那個內(nèi)存池不是標準的。VC下的STL就沒這個。  回復  更多評論   

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

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

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

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

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

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

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

很好;)  回復  更多評論   

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲免费电影在线| 欧美高清视频在线| 亚洲午夜91| 国产精品女人久久久久久| 欧美一级电影久久| 亚久久调教视频| 亚洲成人在线免费| 亚洲人成网站色ww在线| 亚洲天堂免费观看| 亚洲国产精品va在线看黑人动漫| 亚洲一区在线直播| 黄色日韩精品| 亚洲激情在线激情| 国产女人水真多18毛片18精品视频| 久久久久国产精品www| 久久综合九色九九| 一区二区久久久久久| 亚洲在线中文字幕| 亚洲日本中文字幕| 午夜精品一区二区三区电影天堂| 亚洲电影专区| 亚洲制服av| 亚洲日本成人在线观看| 亚洲免费在线| 日韩午夜高潮| 久久国产精品久久国产精品| 亚洲伦伦在线| 久久精品123| 亚洲一区二区精品在线观看| 久久久欧美精品| 亚洲免费综合| 欧美成人精品h版在线观看| 亚洲欧美精品suv| 欧美第十八页| 免费久久99精品国产自在现线| 欧美三日本三级少妇三2023 | 国产美女精品视频| 亚洲国产第一页| 国产字幕视频一区二区| 夜夜嗨av色综合久久久综合网 | 国产精品美女久久久久久2018| 免费一级欧美片在线观看| 国产精品免费看| 日韩一本二本av| 亚洲欧洲一区二区天堂久久 | 欧美激情综合色综合啪啪| 久久免费国产精品| 国产精品一区二区三区乱码| 亚洲精品乱码久久久久久久久| 狠狠做深爱婷婷久久综合一区 | 欧美激情乱人伦| 好看的亚洲午夜视频在线| 午夜日韩福利| 欧美一区二区三区男人的天堂| 欧美日韩一区二区高清| 亚洲精品久久久久久久久| 亚洲人成网站999久久久综合| 久久精品首页| 噜噜噜在线观看免费视频日韩 | 欧美高清你懂得| 欧美激情精品久久久久久| 亚洲国产免费| 免费亚洲一区二区| 亚洲黄网站黄| 一区二区免费看| 欧美特黄一级大片| 亚洲一卡二卡三卡四卡五卡| 在线中文字幕一区| 亚洲一区二区精品| 国产精品久久久久三级| 亚洲视频www| 欧美在线视屏| 国内成+人亚洲| 噜噜噜噜噜久久久久久91| 欧美激情精品久久久久久变态| 亚洲激情视频网站| 欧美精品自拍偷拍动漫精品| 一本色道久久综合亚洲精品高清| 亚洲一区欧美二区| 国产视频综合在线| 久色成人在线| 亚洲精品久久久蜜桃| 亚洲欧美久久| 伊人婷婷欧美激情| 欧美久久婷婷综合色| 亚洲欧美成人一区二区在线电影| 久久久久国产成人精品亚洲午夜| 亚洲成人资源网| 欧美午夜剧场| 久久久www| 99国产精品久久久久久久久久| 欧美一区二区三区四区高清| 在线观看视频免费一区二区三区| 欧美精品一区二区在线播放| 亚洲欧美日本在线| 亚洲丰满在线| 翔田千里一区二区| 亚洲二区视频| 国产精品日韩精品欧美精品| 久久躁日日躁aaaaxxxx| 在线一区二区三区四区五区| 久久一区二区三区国产精品| 一区二区成人精品 | 国模精品娜娜一二三区| 欧美激情精品久久久久久| 午夜亚洲福利| 亚洲人屁股眼子交8| 久久久女女女女999久久| 99综合在线| 亚洲丰满在线| 国产日韩欧美一二三区| 欧美日韩国产一区二区三区| 久久久久久免费| 亚洲综合电影| 亚洲精品之草原avav久久| 免费成人av| 久久精品视频在线| 亚洲免费中文字幕| 一区二区电影免费在线观看| 亚洲国产精品成人久久综合一区| 国产美女精品免费电影| 国产精品成人观看视频免费| 欧美国产日韩在线| 久久综合精品一区| 久久久99免费视频| 欧美综合激情网| 欧美一区二区女人| 亚洲男人第一av网站| 中文欧美日韩| 在线视频日韩| 夜夜嗨av一区二区三区网页 | 欧美一区二区视频在线观看| 一本色道久久99精品综合| 最新日韩欧美| 亚洲国产精品久久久久秋霞影院| 国产香蕉97碰碰久久人人| 国产欧美精品xxxx另类| 亚洲精品少妇| 亚洲一区二区精品| 欧美激情第10页| 欧美激情四色 | 亚洲黑丝在线| 亚洲精品日本| 亚洲免费久久| 亚洲视频在线观看三级| 亚洲一区二区不卡免费| 亚洲免费一在线| 欧美在线网址| 久久最新视频| 欧美精品日韩一区| 欧美日韩综合在线免费观看| 国产精品久久久久久久久婷婷| 国产精品久久久久久久免费软件| 国产精品永久| 影音先锋亚洲电影| 亚洲日本激情| 亚洲综合第一| 久久久水蜜桃av免费网站| 欧美成人精品在线观看| 亚洲高清不卡一区| 亚洲色图制服丝袜| 欧美怡红院视频| 欧美成人伊人久久综合网| 欧美三级精品| 国产亚洲欧美色| 亚洲麻豆国产自偷在线| 亚洲在线观看免费| 久久久亚洲欧洲日产国码αv | 欧美成人免费一级人片100| 亚洲精品久久久久久下一站| 亚洲欧美日韩一区在线观看| 久久久综合香蕉尹人综合网| 欧美日韩高清一区| 国产午夜精品久久久| 亚洲欧洲一区二区在线播放| 亚洲欧美成人一区二区三区| 久久综合色婷婷| 99国产精品久久久久久久成人热| 久久av一区二区三区漫画| 欧美久久久久| 国语自产精品视频在线看| 99精品国产一区二区青青牛奶| 欧美在线3区| 亚洲精品一区中文| 久久精品国产一区二区三区| 欧美日韩亚洲一区二区三区| 好吊色欧美一区二区三区视频| 一区二区三区回区在观看免费视频| 久久久在线视频| 一区二区欧美精品| 欧美成人午夜视频| 精久久久久久| 欧美一级精品大片| 一区二区三区高清不卡| 免费观看成人网| 伊人成人在线| 久久精品99国产精品酒店日本| 日韩一区二区精品| 欧美激情va永久在线播放| 精品1区2区|