• <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>
            總結下常見的C++內存池,以備以后查詢。
            應該說沒有一個內存池適合所有的情況, 根據不同的需求選擇正確的內存池才是正道.

            (1)最簡單的固定大小緩沖池

                適用于頻繁分配和釋放固定大小對象的情況, 關于這個內存池,我這里總結過:一個高效的內存池實現


            (2)dlmalloc
                  應該來說相當優秀的內存池, 支持大對象和小對象,并且已被廣泛使用。到這里下載:ftp://g.oswego.edu/pub/misc/malloc.c
                  關于dlmalloc的內部原理和使用資料可以參考:內存分配器dlmalloc 2.8.3源碼淺析.doc


            (3) SGI STL 中的內存分配器( allocator )

             SGI STL  allocator 應該是目前設計最優秀的 C++ 內存分配器之一了,它的運作原理候捷老師在《 STL 源碼剖析》里講解得非常清楚。基本思路是設計一個 free_list[16] 數組,負責管理從 8 bytes  128 bytes 不同大小的內存塊( chunk ),每一個內存塊都由連續的固定大小( fixed size block )的很多 chunk 組成,并用指針鏈表串接起來。比如說

                free_list[3]->start_notuse->next_notuse->next_notuse->...->end_notuse;

             當用戶要獲取此大小的內存時,就在 free_list 的鏈表找一個最近的 free chunk 回傳給用戶,同時將此 chunk  free_list 里刪除,即把此 chunk 前后 chunk 指針鏈結起來。用戶使用完釋放的時候,則把此chunk 放回到 free_list 中,應該是放到最前面的 start_free 的位置。這樣經過若干次 allocator  deallocator 后, free_list 中的鏈表可能并不像初始的時候那么是 chunk 按內存分布位置依次鏈接的。假如free_list 中不夠時, allocator 會自動再分配一塊新的較大的內存區塊來加入到 free_list 鏈表中。

             可以自動管理多種不同大小內存塊并可以自動增長的內存池,這是 SGI STL 分配器設計的特點。



            (4) Loki 中的小對象分配器( small object allocator )

                 Loki 的分配器與 SGI STL 的原理類似,不同之處是它管理 free_list 不是固定大小的數組,而是用一個 vector 來實現,因此可以用戶指定 fixed size block 的大小,不像 SGI STL 是固定最大 128 bytes 的。另外它管理 free chunks 的方式也不太一樣, Loki 是由一列記錄了 free block 位置等信息的 Chunk 類的鏈表來維護的, free blocks 則是分布在另外一個連續的大內存區間中。而且 free Chunks 也可以根據使用情況自動增長和減少合適的數目,避免內存分配得過多或者過少。



            (5)  Boost 的 object_pool

                Boost 中的 object_pool 也是一個可以根據用戶具體應用類的大小來分配內存塊的,也是通過維護一個 free nodes 的鏈表來管理的。可以自動增加 nodes 塊,初始是 32  nodes ,每次增加都以兩倍數向 system heap 要內存塊。 object_pool 管理的內存塊需要在其對象銷毀的時候才返還給 system heap 



            (6)ACE 中的 ACE_Cached_Allocator 和 ACE_Free_List

              ACE 框架中也有一個可以維護固定大小的內存塊的分配器,原理與上面講的內存池都差不多。它是通過在 ACE_Cached_Allocator 中定義個 Free_list 鏈表來管理一個連續的大內存塊的,里面包含很多小的固定大小的未使用的區塊( free chunk ),同時還使用 ACE_unbounded_Set 維護一個已使用的 chuncks ,管理方式與上面講的內存池類似。也可以指定 chunks 的數目,也可以自動增長,定義大致如下所示:

             

            template<class T>
            class ACE_Cached_Allocator : public ACE_New_Allocator<T> {
            public:
                // Create a cached memory pool with @a n_chunks chunks
                
            // each with sizeof (TYPE) size.
                ACE_Cached_Allocator(SIZET n_chunks = ACE_DEFAULT_INIT_CHUNKS);
                T* allocate();
                void deallocate(T* p);
            private:
                // List of memory that we have allocated.
                Fast_Unbounded_Set<char *> _allocated_chunks;
                // Maintain a cached memory free list.
                ACE_Cached_Free_List<ACE_Cached_Mem_Pool_Node<T> > _free_list;
            };




            (7)TCMalloc

              Google的開源項目gperftools, 主頁在這里:https://code.google.com/p/gperftools/,該內存池也被大家廣泛好評,并且在google的各種開源項目中被使用, 比如webkit就用到了它。

            posted on 2013-04-08 20:53 Richard Wei 閱讀(17176) 評論(0)  編輯 收藏 引用 所屬分類: C++
            亚洲精品乱码久久久久久蜜桃不卡| 国产高清美女一级a毛片久久w| 狠色狠色狠狠色综合久久| 天天做夜夜做久久做狠狠| 国产精品久久久久乳精品爆| 99久久成人国产精品免费| 人妻少妇久久中文字幕一区二区| 久久久久18| 久久久久久久综合综合狠狠| 国内精品久久久久久久亚洲| 久久AⅤ人妻少妇嫩草影院| 久久久久99精品成人片| 亚洲精品美女久久久久99小说 | 国产精品久久久久jk制服| 久久综合给合久久狠狠狠97色69 | 亚洲精品成人久久久| 久久久久人妻一区二区三区| 久久伊人五月天论坛| 伊人久久大香线蕉亚洲| 色综合久久综合网观看| 久久天天躁狠狠躁夜夜2020一| 97久久天天综合色天天综合色hd| 国产精品免费久久久久电影网| 一本色道久久综合亚洲精品| 国内精品伊人久久久久影院对白| 中文字幕乱码人妻无码久久| 韩国三级中文字幕hd久久精品 | 亚洲中文久久精品无码| 久久久精品一区二区三区| 久久久久久久精品成人热色戒| 国产99久久久国产精品~~牛 | 少妇内射兰兰久久| 亚洲欧洲精品成人久久曰影片| 伊人久久大香线蕉影院95| 97久久天天综合色天天综合色hd| 亚洲午夜久久久久久久久电影网 | 久久天天婷婷五月俺也去| 久久久精品国产亚洲成人满18免费网站| 久久国产色AV免费观看| 国产成人久久AV免费| 久久精品国产精品亚洲毛片|