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

loop_in_codes

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

SGI STL的內存池

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

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

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

我簡單地畫了幅圖表示整個結構:

allocator

allocator內部維護一個鏈表數組,數組元素全部是鏈表頭指針。鏈表A每一個節點維護一個8bytes的內存塊,鏈表
B每一個節點維護一個16bytes的內存塊。

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

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

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

   

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所指向的內存,而這些鏈表的節點,都
是直接保存在這塊內存里的,所以完全沒有額外消耗。

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

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

評論

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

我自己也曾經做過一個內存池,方法沒去比較不知道如何。

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

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

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

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

唉 水已經滿了 會錯過很多東西的  回復  更多評論   

# re: SGI STL的內存池 2008-06-13 10:41 關中刀客

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

# re: SGI STL的內存池 2008-06-13 12:36 Kevin Lynx

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

# re: SGI STL的內存池 2008-06-14 00:11 Gohan

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

# re: SGI STL的內存池 2008-06-15 09:40 Kevin Lynx

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

# re: SGI STL的內存池 2008-06-15 12:51 Gohan

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

# re: SGI STL的內存池 2008-06-23 17:27 Bugs

很好;)  回復  更多評論   

# re: SGI STL的內存池 2009-09-08 18:17 Ericxiao

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

# re: SGI STL的內存池 2009-12-02 10:07 dpslaile

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合给合久久狠狠色| 欧美亚洲免费| 久久在线精品| 久久成人这里只有精品| 欧美一级黄色网| 午夜精品福利在线观看| 午夜久久资源| 久久只精品国产| 欧美母乳在线| 国产精品永久免费在线| 国产乱码精品| 亚洲欧洲日本一区二区三区| 99精品视频免费| 亚洲欧美日韩网| 激情伊人五月天久久综合| 韩国成人福利片在线播放| 激情六月婷婷综合| 亚洲欧洲美洲综合色网| 亚洲自啪免费| 国产精品不卡在线| 亚洲欧美中文日韩在线| 久久大逼视频| 久久精品视频在线| 欧美区一区二| 免费成人性网站| 亚洲精品社区| 新狼窝色av性久久久久久| 久热精品视频在线观看| 一区二区精品国产| 久久久久久黄| 国产精品久久久久久一区二区三区| 国产自产精品| 中文亚洲字幕| 亚洲国产日韩欧美| 亚洲制服丝袜在线| 亚洲第一在线视频| 亚洲最黄网站| 欧美刺激性大交免费视频| 国产伦精品一区二区三区四区免费 | 国产精品稀缺呦系列在线| 在线观看成人av电影| 亚洲欧美激情一区二区| 久久激情综合网| 亚洲毛片av| 欧美二区在线观看| 黄网站免费久久| 午夜精品久久久久久久久久久久久| 欧美成人一区二免费视频软件| 亚洲一区二区免费看| 欧美日本国产在线| 亚洲欧洲偷拍精品| 老司机精品视频网站| 欧美一区亚洲二区| 宅男噜噜噜66一区二区66| 欧美激情亚洲视频| 亚洲区一区二| 欧美高清一区二区| 久久婷婷av| 久久精品国产77777蜜臀| 欧美国产亚洲视频| 免费在线日韩av| 韩国在线一区| 久久一区二区三区四区五区| 亚洲综合大片69999| 国产精品一区二区三区久久久 | 国产精品你懂的在线| 一区二区国产日产| 99re6热只有精品免费观看| 欧美日本亚洲| 亚洲性人人天天夜夜摸| 欧美国产日韩在线观看| 亚洲观看高清完整版在线观看| 久久国产精品亚洲77777| 一本到高清视频免费精品| 一片黄亚洲嫩模| 欧美午夜视频网站| 性亚洲最疯狂xxxx高清| 欧美激情小视频| 亚洲区一区二区三区| 一本不卡影院| 一区在线视频| 亚洲人精品午夜| 欧美无砖砖区免费| 久久久蜜桃一区二区人| 免费看的黄色欧美网站| 中文在线一区| 久久精品中文| 中国成人亚色综合网站| 欧美一区二区黄| 日韩一级精品| 久久激情久久| 亚洲一二三级电影| 久久精品国产精品| 国产精品日韩| 欧美大尺度在线| 国产精品日韩二区| 亚洲国产成人tv| 国产美女在线精品免费观看| 欧美成人精品在线视频| 国产精品国产亚洲精品看不卡15| 亚洲精品三级| 亚洲看片免费| 伊人久久亚洲影院| 一本色道久久综合亚洲精品不卡| 国外成人在线| 亚洲自拍啪啪| 日韩视频中午一区| 久久九九热re6这里有精品| 亚洲一区尤物| 免费中文日韩| 久久色在线播放| 国产精品乱人伦一区二区| 亚洲国产老妈| 一区在线影院| 亚洲欧美日韩综合aⅴ视频| 日韩网站在线观看| 欧美护士18xxxxhd| 国产尤物精品| 亚洲一区二区成人在线观看| 亚洲每日在线| 久久综合国产精品| 久久久999成人| 国产精品影音先锋| 欧美二区在线| 久久免费视频在线观看| 国产精品美女诱惑| 99这里有精品| 国产精品99久久99久久久二8| 牛牛影视久久网| 欧美高清视频| 亚洲人成网站精品片在线观看| 久久精品最新地址| 久久影视三级福利片| 国产一区亚洲| 国产深夜精品| 亚洲一区二区毛片| 99riav1国产精品视频| 久久久精品一区| 亚洲精选一区二区| 在线视频你懂得一区| 欧美jizzhd精品欧美巨大免费| 久久视频在线免费观看| 国产亚洲精品自拍| 亚洲欧美一级二级三级| 久久动漫亚洲| 国语自产在线不卡| 国内外成人免费视频| 亚洲欧美日韩精品一区二区 | 久久综合中文字幕| 国语精品中文字幕| 美女脱光内衣内裤视频久久影院 | 国产精品一区二区在线| 亚洲一区中文字幕在线观看| 亚洲欧美另类久久久精品2019| 欧美日韩一区三区| 亚洲男人av电影| 在线不卡亚洲| 免费黄网站欧美| 日韩视频精品| 欧美在线不卡| 中文亚洲欧美| 欧美区一区二| 欧美一级片在线播放| 国产精品理论片在线观看| 先锋影音久久| 在线观看国产日韩| 欧美久久久久久久| 午夜国产一区| 欧美黄色aaaa| 性做久久久久久久久| 亚洲电影免费在线| 国产精品video| 久久一区亚洲| 亚洲一区二区免费视频| 裸体歌舞表演一区二区| 洋洋av久久久久久久一区| 国产精品午夜在线观看| 欧美sm视频| 欧美在线观看你懂的| 亚洲人成77777在线观看网| 午夜在线不卡| 亚洲精品乱码久久久久久蜜桃91| 亚洲性图久久| 欧美大片网址| 欧美一区二区三区在线观看视频| 亚洲激情在线播放| 国产精自产拍久久久久久蜜 | 国产精品久久毛片a| 久久香蕉国产线看观看av| 欧美精品电影在线| 亚洲一区激情| 亚洲日韩视频| 欧美成人免费小视频| 久久精品中文| 亚洲欧美日韩中文视频| 亚洲伦理在线免费看| 99成人免费视频| 久久精品国产久精国产爱| 亚洲午夜视频在线| 亚洲精品国产精品国产自|