• <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實(shí)現(xiàn)的一個(gè)內(nèi)存池

            今天在看ACE內(nèi)存分配的時(shí)候(太多,沒看完),發(fā)現(xiàn)分配策略不全,我想實(shí)現(xiàn)一個(gè)能緩存,高效,內(nèi)存總量不限的分配策略用于對(duì) ACE_Message_Block對(duì)象的緩存,雖然ACE_Message_Block支持為它設(shè)置三種分配器,一個(gè)是對(duì)ACE_Message_Block對(duì)象本身message_block_allocator_,一個(gè)是對(duì)ACE_Data_Block本身data_block_allocator_,還有一個(gè)是對(duì)ACE_Data_Block的數(shù)據(jù)緩沖區(qū)的分配器allocator_strategy_,但是感覺ACE的分配器實(shí)現(xiàn)起來復(fù)雜,方法也多,就自己實(shí)現(xiàn)了一個(gè),下面是部分代碼,僅供參考

            // 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維內(nèi)存緩沖機(jī)制,每次new出一個(gè)緩沖鏈,每個(gè)緩沖鏈為
                    <BlockCount>個(gè)大小為<BlockSize>的內(nèi)存塊,緩沖鏈之間建立鏈表關(guān)
                    系。

                    優(yōu)點(diǎn):
                    1、不存在realloc,緩沖地址固定不變;
                    2、緩沖池大小由小變大,動(dòng)態(tài)增長(zhǎng),不是一開始就分配一個(gè)超大的內(nèi)
                    存,真正按需分配;
                    3、支持鎖策略,目前用的ACE的鎖,可以很方便的改為其他的鎖策略;
                    4、支持FreeList,高效;

                    缺點(diǎn):
                    1、分配的對(duì)象在長(zhǎng)時(shí)間不用時(shí)不能智能釋放

                    要求:
                    1、每個(gè)塊的大小必須大于等于sizeof(CacheNode)

                    示例:
                    typedef CachePool<ACE_SYNCH_NULL_MUTEX>        CachePool_NullMutex; // 單線程
                    typedef CachePool<ACE_SYNCH_MUTEX>            CachePool_Mutex;     // 多線程
                    
                    CachePool_Mutex pool(1024, 256)
                    void* buf = pool.alloc();
                    pool.free(buf);
                    pool.clear();

                
            */

                template
            <class _ACEMutex>
                
            class CachePool
                
            {
            protected:
                    
            /// 緩沖鏈: Head + cache1 + cache2 + cacheN (N=BlockCount)
                    struct CacheChain
                    
            {
                        CacheChain
            * _Next;

                        
            void* data() return this + 1; }

                        inline 
            static CacheChain* create(CacheChain*& head, size_t blockSize, size_t blockCount)
                        
            {
                            CacheChain
            * p = (CacheChain*new char[sizeof(CacheChain) + blockCount * blockSize];
                            p
            ->_Next = head;
                            
            return head = p;
                        }


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

                        }

                    }
            ;

                    
            /// 空閑對(duì)象節(jié)點(diǎn),僅僅在空閑對(duì)象中有效
                    struct CacheNode
                    
            {
                        CacheNode
            * _Next;
                    }
            ;

                    size_t            _BlockSize;        
            /// 數(shù)據(jù)塊的字節(jié)大小
                    size_t            _BlockCount;    /// 每次連續(xù)分配的塊數(shù)
                    CacheChain*        _ChainList;        /// 每次分配的緩沖鏈
                    CacheNode*        _FreeNode;        /// 當(dāng)前空閑節(jié)點(diǎn)
                    _ACEMutex*        _Mutex;            /// 線程互斥體
                    bool            _DeleteMutex;    /// 是否在析構(gòu)的時(shí)候刪除互斥體

                
            public:
                    CachePool()
                        : _BlockSize(
            0), _BlockCount(0), _ChainList(0), _FreeNode(0), _Mutex(0), _DeleteMutex(false)
                    
            {
                    }


                    CachePool(size_t blockSize, size_t blockCount, _ACEMutex
            * mutex = 0)
                        : _ChainList(
            0), _FreeNode(0), _Mutex(mutex)
                    
            {
                        create(blockSize, blockCount, mutex);
                    }


                    
            ~CachePool()
                    
            {
                        
            if (_Mutex != 0 && _DeleteMutex)
                        
            {
                            clear();

                            delete _Mutex;
                            _Mutex 
            = 0;
                            _DeleteMutex 
            = false;
                        }

                    }


                    
            /// 清除所有的內(nèi)存空間
                    void clear()
                    
            {
                        ACE_GUARD(_ACEMutex, ace_mon, 
            *_Mutex);

                        
            if (_ChainList)
                        
            {
                            _ChainList
            ->free();
                            _ChainList 
            = 0;
                            _FreeNode 
            = 0;
                        }

                    }


                    
            /// 初始化參數(shù)
                    void create(size_t blockSize, size_t blockCount, _ACEMutex* mutex = 0)
                    
            {
                        _BlockSize 
            = blockSize;
                        _BlockCount 
            = blockCount;

                        assert(_BlockCount 
            >= 1);
                        assert(
            sizeof(CacheNode) <= _BlockSize);

                        
            if (_DeleteMutex && _Mutex)
                            delete _Mutex;

                        
            if (mutex != 0)
                        
            {
                            _Mutex 
            = mutex;
                            _DeleteMutex 
            = false;
                        }

                        
            else
                        
            {
                            _Mutex 
            = new _ACEMutex();
                            _DeleteMutex 
            = true;
                        }

                    }


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


                    
            /// 獲取連續(xù)分配的塊的數(shù)目
                    size_t getBlockCount() const
                    
            {
                        
            return _BlockCount;
                    }


                    
            /// 分配一個(gè)塊內(nèi)存
                    void* alloc()
                    
            {
                        assert(_BlockCount 
            >= 1);
                        assert(
            sizeof(CacheNode) <= _BlockSize);
                        assert(_Mutex 
            != NULL);

                        ACE_GUARD_RETURN(_ACEMutex, ace_mon, 
            *_Mutex, NULL);

                        
            if (_FreeNode == 0)
                        
            {
                            
            // 分配另一個(gè)數(shù)據(jù)鏈
                            CacheChain* newChain = CacheChain::create(_ChainList, _BlockSize, _BlockCount);

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

                            
            // 定位到最后一個(gè)節(jié)點(diǎn)
                            (char*&)node += _BlockSize * (_BlockCount - 1);

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

                        }


                        assert(_FreeNode 
            != 0);

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

                        
            return block;
                    }


                    
            /// 釋放塊內(nèi)存
                    void free(void* block)
                    
            {
                        ACE_GUARD(_ACEMutex, ace_mon, 
            *_Mutex);

                        
            if (block != 0)
                        
            {
                            CacheNode
            * node = (CacheNode*)block;
                            node
            ->_Next = _FreeNode;
                            _FreeNode 
            = node;
                        }

                    }

                }
            ;



                
            /**
                    對(duì)象池
                    在CachePool的基礎(chǔ)上,增加了對(duì)象的構(gòu)造和析構(gòu)
                    為了更好擴(kuò)充,沒有采取繼承而是包含的作法
                
            */

                template
            <class T, class _ACEMutex>
                
            class ObjectPool
                
            {
                
            protected:
                    typedef CachePool
            <_ACEMutex>    _CachePool;
                    _CachePool    _Pool;

                
            public:
                    ObjectPool()
                    
            {
                    }


                    ObjectPool(size_t blockCount, _ACEMutex
            * mutex = 0)
                    
            {
                        _Pool.create(
            sizeof(T), blockCount, mutex);
                    }


                    
            /// 清除分配的內(nèi)存
                    void clear()
                    
            {
                        _Pool.clear();
                    }


                    
            /// 初始化參數(shù)
                    void create(size_t blockCount, _ACEMutex* mutex = 0)
                    
            {
                        _Pool.create(
            sizeof(T), blockCount, mutex);
                    }


                    
            /// 獲取連續(xù)分配的對(duì)象的數(shù)目
                    size_t getObjectCount() const
                    
            {
                        
            return _Pool.getBlockCount();
                    }


                    
            /// 創(chuàng)建對(duì)象的內(nèi)存空間,但是沒有進(jìn)行構(gòu)造,用戶可以自行進(jìn)行定制的構(gòu)造
                    T* alloc()
                    
            {
                        
            void* obj = _Pool.alloc();
                        ::
            new (obj) T(/* not args */); // 進(jìn)行默認(rèn)構(gòu)造
                        return (T*)obj;
                    }


                    
            /// 釋放對(duì)象
                    void free(T* obj)
                    
            {
                        
            if (obj != 0)
                        
            {
                            obj
            ->~T();
                            _Pool.free(obj);
                        }

                    }

                }
            ;

            }
             // namespace om

            #endif // OM_MEMPOOLT_H

            posted on 2007-10-28 19:54 PeakGao 閱讀(3016) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++技術(shù)

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(9)

            隨筆分類(67)

            隨筆檔案(65)

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久国产劲爆AV内射—百度| 中文字幕无码久久人妻| 偷偷做久久久久网站| 久久e热在这里只有国产中文精品99 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 国产69精品久久久久APP下载| 日韩电影久久久被窝网| 东方aⅴ免费观看久久av| 狼狼综合久久久久综合网| 久久精品嫩草影院| 午夜视频久久久久一区| 青青草原精品99久久精品66| 亚洲伊人久久大香线蕉苏妲己| 性做久久久久久久久| 99久久99久久精品免费看蜜桃| 久久久久无码精品| av午夜福利一片免费看久久| 久久强奷乱码老熟女网站| 人妻精品久久无码区| 精品久久久一二三区| 天天久久狠狠色综合| 无码国产69精品久久久久网站 | 久久精品国产一区二区三区不卡| 亚洲中文字幕无码一久久区| 99精品久久久久久久婷婷| 欧美噜噜久久久XXX| 久久精品国产男包| 精品久久人人妻人人做精品 | 亚洲中文字幕伊人久久无码| 韩国三级大全久久网站| 亚洲国产精品无码久久久不卡 | 久久婷婷色香五月综合激情| 久久国产一区二区| av无码久久久久不卡免费网站| 模特私拍国产精品久久| 久久久久久青草大香综合精品| 青青草原1769久久免费播放| 中文字幕久久欲求不满| 国产精品视频久久久| a级成人毛片久久| 国产精品免费福利久久|