• <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>

            基于ACE實現的一個內存池-續篇

            針對上篇文章《基于ACE實現的一個內存池 》,今天我進行了改版,實之更加方便和合理,代碼如下:
            // MemPoolT.h
            /**
             *    @date 2007.10.25
             *  @author PeakGao <peakgao163@163.com>
             
            */

             #ifndef OM_MEMPOOLT_H
            #define OM_MEMPOOLT_H

            #include 
            <assert.h>
            #include 
            <ace/guard_t.h>
            #include 
            <ace/global_macros.h>

            namespace om{

                
            /**
                    緩沖池

                    緩存池采取2維內存緩沖機制,每次new出一個緩沖鏈,每個緩沖鏈為
                    <GrowBlockCount>個大小為<BlockSize>的內存塊,緩沖鏈之間建立鏈表關
                    系。

                    優點:
                    1、緩沖池大小由小變大,動態增長,不是一開始就分配一個超大的內
                    存,真正按需分配;
                    2、不存在realloc,緩沖地址固定不變;
                    3、支持FreeList,高效;

                    缺點:
                    1、分配的對象在長時間不用時沒有實現智能釋放,以后有需要再改

                    要求:
                    1、每個塊的大小必須大于等于sizeof(Node),32位系統上面是4字節

                    示例:
                    @code
                    class MyObj
                    {
                    public:
                        MyObj()
                        {
                            std_out<<ACE_TEXT("MyObj::MyObj()")<<std_endl;
                        }
                        ~MyObj()
                        {
                            std_out<<ACE_TEXT("MyObj::~MyObj()")<<std_endl;
                        }
                        void foo()
                        {
                            std_out<<ACE_TEXT("MyObj::foo()")<<std_endl;
                        }
                        int dummy; 
                    };

                    void test()
                    {
                        using namespace om;
                        typedef CachePoolWithLock<ACE_Lock_Adapter<ACE_SYNCH_MUTEX> >            CachePool_Lock;

                        CachePool p1;
                        p1.create(1024, 256);
                        void* pp1 = p1.alloc();
                        p1.free(pp1);
                        p1.clear();

                        CachePool_Lock p2(7, 256);
                        void* pp2 = p2.alloc();
                        p2.free(pp2);
                        p2.clear();


                        ObjectPool<MyObj, CachePool_Lock>    pool(128);
                        MyObj* o = pool.alloc();
                        o->foo();
                        pool.free(o);
                        pool.clear();
                    }
                    @endcode
                
            */


                
            #define BYTE_ALIGN_8    /// 是否支持塊尺寸8字節對齊的開關宏


                
            /**
                    緩存池
                    這里只實現邏輯,不考慮線程安全,線程安全的版本見下面的CachePoolWithLock模版
                
            */

                
            class CachePool
                
            {
                
            protected:

                    
            /// 緩沖鏈: Head + cache1 + cache2 + cacheN (N=BlockCount)
                    struct Chain
                    
            {
                        Chain
            * _Next;

                        
            void* data() return this + 1; }

                        inline 
            static Chain* create(Chain*& head, size_t blockSize, size_t blockCount)
                        
            {
            #if defined(BYTE_ALIGN_8)
                            blockSize 
            = blockSize ? ((blockSize + 7& ~7) : 8// 8字節對齊
            #endif
                            Chain
            * p = (Chain*new char[sizeof(Chain) + blockCount * blockSize];

                            p
            ->_Next = head;
                            
            return head = p;
                        }


                        
            void free()
                        
            {
                            Chain
            * p = this;
                            
            while (p)
                            
            {
                                
            char* buf = (char*)p;
                                Chain
            * next = p->_Next;
                                delete[] buf;
                                p 
            = next;
                            }

                        }

                    }
            ;


                    
            /// 空閑對象節點,僅僅在空閑對象中有效
                    struct Node
                    
            {
                        Node
            * _Next;
                    }
            ;


                    size_t    _BlockSize;            
            /// 數據塊的字節大小
                    size_t    _GrowBlockCount;    /// 每次連續分配的塊數
                    Chain*    _ChainList;            /// 每次分配的緩沖鏈
                    Node*    _FreeNode;            /// 當前空閑節點

                
            public:
                    
            /// 默認構造,注意必須調用create方法初始化參數
                    CachePool()
                        : _BlockSize(
            0), _GrowBlockCount(0), _ChainList(0), _FreeNode(0)
                    
            {
                    }


                    CachePool(size_t blockSize, size_t growBlockCount)
                        : _ChainList(
            0), _FreeNode(0)
                    
            {
                        create(blockSize, growBlockCount);
                    }


                    
            ~CachePool()
                    
            {
                        clear();
                    }


                    
            /// 清除所有的內存空間
                    void clear()
                    
            {
                        
            if (_ChainList)
                        
            {
                            _ChainList
            ->free();
                            _ChainList 
            = 0;
                            _FreeNode 
            = 0;
                        }

                    }


                    
            /// 初始化參數
                    void create(size_t blockSize, size_t growBlockCount)
                    
            {
                        _BlockSize 
            = blockSize;
                        _GrowBlockCount 
            = growBlockCount;

                        assert(_GrowBlockCount 
            >= 1);
                        assert(_BlockSize 
            >= sizeof(Node));
                    }


                    
            /// 獲取塊的大小
                    size_t getBlockSize() const
                    
            {
                        
            return _BlockSize;
                    }


                    
            /// 獲取連續分配的塊的數目
                    size_t getGrowBlockCount() const
                    
            {
                        
            return _GrowBlockCount;
                    }


                    
            /// 分配一個塊內存
                    void* alloc()
                    
            {
                        assert(_GrowBlockCount 
            >= 1);
                        assert(_BlockSize 
            >= sizeof(Node));

                        
            if (_FreeNode == 0)
                        
            {
                            
            // 分配另一個數據鏈
                            Chain* newChain = Chain::create(_ChainList, _BlockSize, _GrowBlockCount);

                            Node
            * node = (Node*)newChain->data();

                            
            // 定位到最后一個節點
                            (char*&)node += _BlockSize * (_GrowBlockCount - 1);

                            
            // 建立連接關系
                            for (int i=(int)_GrowBlockCount-1; i>=0; i--, (char*&)node -= _BlockSize)
                            
            {
                                node
            ->_Next = _FreeNode;
                                _FreeNode 
            = node;
                            }

                        }


                        assert(_FreeNode 
            != 0);

                        
            void* block = (void*)_FreeNode;
                        _FreeNode 
            = _FreeNode->_Next;

                        
            return block;
                    }


                    
            /// 釋放塊內存
                    void free(void* block)
                    
            {
                        
            if (block != 0)
                        
            {
                            Node
            * node = (Node*)block;
                            node
            ->_Next = _FreeNode;
                            _FreeNode 
            = node;
                        }

                    }

                }
            ;




                
            /*
                    支持鎖策略的緩存池,目前用的ACE的鎖,可以很方便的改為其他的鎖策略
                    比如_ACELOCK可以為鎖對象ACE_Lock_Adapter<ACE_SYNCH_MUTEX>,也可以
                    直接用互斥體如ACE_SYNCH_NULL_MUTEX
                
            */

                template
            <class ACELOCK>
                
            class CachePoolWithLock : public CachePool
                
            {
                
            protected:
                    ACELOCK        _Lock;            
            /// 鎖

                
            public:
                    CachePoolWithLock()
                    
            {
                    }


                    CachePoolWithLock(size_t blockSize, size_t growBlockCount)
                        : CachePool(blockSize, growBlockCount)
                    
            {
                    }


                    
            /// 清除所有的內存空間
                    void clear()
                    
            {
                        ACE_GUARD(ACELOCK, ace_mon, _Lock);
                        CachePool::clear();
                    }


                    
            /// 分配一個塊內存
                    void* alloc()
                    
            {
                        ACE_GUARD_RETURN(ACELOCK, ace_mon, _Lock, NULL);
                        
            return CachePool::alloc();
                    }


                    
            /// 釋放塊內存
                    void free(void* block)
                    
            {
                        ACE_GUARD(ACELOCK, ace_mon, _Lock);
                        CachePool::free(block);
                    }

                }
            ;

                
            /**
                    對象池
                    在緩沖池的基礎上,增加了對象的構造和析構為了更好擴充,模版參數直接傳入緩沖池類型,可
                    以是上面的CachePool、CachePoolWithLock,也可以是用戶自定義的緩沖池,但必須符合調用規范
                
            */

                template
            <class T, class CachePoolStrategy>
                
            class ObjectPool : public CachePoolStrategy
                
            {
                
            protected:
                    typedef CachePoolStrategy _Base;

                
            public:
                    ObjectPool()
                    
            {
                    }


                    ObjectPool(size_t growBlockCount)
                        : _Base(
            sizeof(T), growBlockCount)
                    
            {
                    }


                    
            /// 初始化參數
                    void create(size_t growBlockCount)
                    
            {
                        _Base::create(
            sizeof(T), growBlockCount);
                    }


                    
            /// 創建對象的內存空間,但是沒有進行構造,用戶可以自行進行定制的構造
                    T* alloc()
                    
            {
                        
            void* obj = _Base::alloc();
                        ::
            new (obj) T(); // 只提供了采用默認構造的方式
                        return (T*)obj;
                    }


                    
            /// 釋放對象
                    void free(T* obj)
                    
            {
                        
            if (obj != 0)
                        
            {
                            obj
            ->~T();
                            _Base::free(obj);
                        }

                    }

                }
            ;

            }
             // namespace om

            #endif // OM_MEMPOOLT_H

            posted on 2007-10-29 12:43 PeakGao 閱讀(2706) 評論(2)  編輯 收藏 引用 所屬分類: C++技術

            評論

            # re: 基于ACE實現的一個內存池-續篇 2008-02-21 08:53 感恩的心

            good  回復  更多評論   

            # re: 基于ACE實現的一個內存池-續篇 2009-05-08 23:33 imdavid

            沒看出來和其他的mmpl 有什么不同, 請作者講下.

            好一點的都是自己實現malloc/free, 然后+上HASH LIST 和 鏈表管理。

              回復  更多評論   

            <2007年10月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            導航

            統計

            常用鏈接

            留言簿(9)

            隨筆分類(67)

            隨筆檔案(65)

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            狠狠色丁香久久婷婷综合蜜芽五月 | 婷婷久久综合九色综合98| 日日狠狠久久偷偷色综合0| 99久久国产热无码精品免费久久久久 | 无码人妻久久一区二区三区免费丨 | 亚洲国产综合久久天堂| 久久久久97国产精华液好用吗| 99久久无码一区人妻| 国产成人精品久久综合| 久久久久久久国产免费看| 久久精品一区二区影院| 亚洲国产成人久久笫一页| 中文无码久久精品| 韩国无遮挡三级久久| 国产91久久综合| 中文字幕精品久久久久人妻| 99久久精品国产一区二区| 99国产精品久久| 久久久99精品一区二区 | 国内精品久久久久影院亚洲| 久久精品国产99国产精品亚洲| 欧洲人妻丰满av无码久久不卡| 国产精品一区二区久久| 久久综合九色综合欧美就去吻| 久久久久精品国产亚洲AV无码| 国产精品久久久久9999| 久久99精品久久久久久噜噜| 国内精品伊人久久久久妇| 国产精品久久成人影院| 热久久国产欧美一区二区精品| 亚洲人成伊人成综合网久久久| 亚洲一区二区三区日本久久九| 欧美一区二区久久精品| 狠狠色丁香久久婷婷综| 一级a性色生活片久久无少妇一级婬片免费放 | 久久久久国产一区二区| 久久久无码精品亚洲日韩按摩| 久久一本综合| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 精品久久人人爽天天玩人人妻| 青青青青久久精品国产h|