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

基于ACE實現的一個內存池

今天在看ACE內存分配的時候(太多,沒看完),發現分配策略不全,我想實現一個能緩存,高效,內存總量不限的分配策略用于對 ACE_Message_Block對象的緩存,雖然ACE_Message_Block支持為它設置三種分配器,一個是對ACE_Message_Block對象本身message_block_allocator_,一個是對ACE_Data_Block本身data_block_allocator_,還有一個是對ACE_Data_Block的數據緩沖區的分配器allocator_strategy_,但是感覺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出一個緩沖鏈,每個緩沖鏈為
        <BlockCount>個大小為<BlockSize>的內存塊,緩沖鏈之間建立鏈表關
        系。

        優點:
        1、不存在realloc,緩沖地址固定不變;
        2、緩沖池大小由小變大,動態增長,不是一開始就分配一個超大的內
        存,真正按需分配;
        3、支持鎖策略,目前用的ACE的鎖,可以很方便的改為其他的鎖策略;
        4、支持FreeList,高效;

        缺點:
        1、分配的對象在長時間不用時不能智能釋放

        要求:
        1、每個塊的大小必須大于等于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;
                }

            }

        }
;

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

        size_t            _BlockSize;        
/// 數據塊的字節大小
        size_t            _BlockCount;    /// 每次連續分配的塊數
        CacheChain*        _ChainList;        /// 每次分配的緩沖鏈
        CacheNode*        _FreeNode;        /// 當前空閑節點
        _ACEMutex*        _Mutex;            /// 線程互斥體
        bool            _DeleteMutex;    /// 是否在析構的時候刪除互斥體

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

        }


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

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

        }


        
/// 初始化參數
        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;
        }


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


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

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

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

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

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

                
// 建立連接關系
                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;
        }


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

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

        }

    }
;



    
/**
        對象池
        在CachePool的基礎上,增加了對象的構造和析構
        為了更好擴充,沒有采取繼承而是包含的作法
    
*/

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


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


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


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


        
/// 創建對象的內存空間,但是沒有進行構造,用戶可以自行進行定制的構造
        T* alloc()
        
{
            
void* obj = _Pool.alloc();
            ::
new (obj) T(/* not args */); // 進行默認構造
            return (T*)obj;
        }


        
/// 釋放對象
        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 閱讀(3029) 評論(0)  編輯 收藏 引用 所屬分類: C++技術

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

導航

統計

常用鏈接

留言簿(9)

隨筆分類(67)

隨筆檔案(65)

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩一区| 99re66热这里只有精品4| 久久久久国产精品www| 亚洲女同精品视频| 欧美一区亚洲| 久久久久久91香蕉国产| 久久亚洲私人国产精品va媚药| 午夜精品视频在线观看| 午夜在线视频一区二区区别| 欧美一区二区播放| 久久手机精品视频| 欧美日韩视频第一区| 国产精品―色哟哟| 亚洲国产日韩精品| 亚洲影院在线观看| 久久先锋影音av| 亚洲国产日韩在线一区模特| 亚洲另类在线一区| 亚洲特色特黄| 亚洲电影av在线| 亚洲国产欧美日韩精品| 99热精品在线观看| 欧美一级日韩一级| 欧美精品亚洲二区| 国产拍揄自揄精品视频麻豆| 在线观看欧美| 亚洲欧美日韩系列| 欧美激情亚洲一区| 午夜精品一区二区三区电影天堂| 免费日韩一区二区| 国产午夜精品全部视频播放| 亚洲激情第一页| 欧美中文日韩| 亚洲日本电影在线| 久久蜜桃av一区精品变态类天堂| 欧美肉体xxxx裸体137大胆| 影音欧美亚洲| 欧美在线免费观看视频| 亚洲人人精品| 久久综合中文字幕| 国产日韩欧美成人| 日韩视频精品| 亚洲国产精品久久| 久久午夜精品| 国产主播一区二区三区四区| 一本大道久久精品懂色aⅴ| 欧美黄色网络| 久久躁日日躁aaaaxxxx| 国产一区视频在线观看免费| 亚洲欧美日韩国产中文| 日韩亚洲欧美高清| 欧美国产日韩xxxxx| 亚洲国产精品一区二区第一页| 久久久亚洲国产天美传媒修理工| 亚洲综合电影| 国产精品人成在线观看免费 | 欧美大片免费久久精品三p| 亚洲男人第一av网站| 欧美三区在线| 亚洲视频在线一区| 亚洲靠逼com| 欧美国产日本在线| 亚洲精品少妇| 亚洲免费成人av电影| 欧美人与禽猛交乱配视频| 亚洲国产精品久久久久| 欧美电影在线观看| 欧美成在线观看| 这里只有精品视频在线| 亚洲最新色图| 国产精品专区第二| 久久国产精品久久国产精品| 亚洲欧美在线观看| 国产一区二区丝袜高跟鞋图片 | 夜夜精品视频| 国产精品一区二区久久| 久久精品夜夜夜夜久久| 久久国产黑丝| 亚洲黄色高清| 亚洲精品久久久久久下一站 | 久久综合网络一区二区| 久久综合五月天婷婷伊人| 亚洲老司机av| 亚洲一区三区视频在线观看 | 欧美日韩大片| 亚洲自拍都市欧美小说| 性欧美18~19sex高清播放| 国产在线不卡精品| 亚洲黄色免费网站| 欧美日韩国产综合网| 亚洲欧美视频在线观看视频| 亚洲伊人伊色伊影伊综合网| 精品99一区二区| 亚洲精品美女久久7777777| 国产精品成人va在线观看| 久久精品亚洲国产奇米99| 美女视频黄 久久| 亚洲一区二区三区国产| 欧美主播一区二区三区美女 久久精品人 | 欧美成人亚洲| 欧美在线地址| 欧美另类一区| 久久亚洲影院| 伊人久久亚洲影院| 99精品热视频| 在线欧美视频| 亚洲欧美电影在线观看| 亚洲国产成人一区| 性做久久久久久免费观看欧美| 日韩亚洲综合在线| 久久久99爱| 亚洲欧美精品一区| 欧美精品一区二区三区蜜臀| 久久美女性网| 国产欧美日韩精品a在线观看| 亚洲精品国产欧美| 91久久精品一区二区别| 久久久久久久久久久成人| 欧美在线免费观看视频| 国产精品久久久久aaaa| 亚洲精品一区二区三区在线观看| 亚洲电影下载| 久久精品亚洲乱码伦伦中文 | 亚洲一区中文| 免费成人美女女| 亚洲精品在线免费| 国产精品久久久久天堂| 亚洲天堂成人| 欧美色网在线| 亚洲人成亚洲人成在线观看| 国产亚洲午夜| 午夜欧美大片免费观看| 国产精品99久久久久久有的能看| 免费在线国产精品| 久久午夜色播影院免费高清| 国产麻豆午夜三级精品| 午夜精彩国产免费不卡不顿大片| 亚洲一级黄色av| 国产精品久久久久影院亚瑟| 一本色道久久综合亚洲精品按摩| 在线一区观看| 国产精品久久国产精品99gif| 小处雏高清一区二区三区 | 欧美福利一区二区| 欧美国产大片| 亚洲精品在线观| 欧美激情四色 | 欧美激情第五页| 亚洲国产va精品久久久不卡综合| 亚洲第一精品夜夜躁人人躁| 男女精品网站| 亚洲精品美女91| 亚洲一区美女视频在线观看免费| 欧美日韩精品国产| 亚洲欧美另类在线| 久久亚洲国产精品一区二区| 国内精品嫩模av私拍在线观看| 久久精品国产2020观看福利| 老**午夜毛片一区二区三区| 91久久线看在观草草青青| 欧美精品成人一区二区在线观看| 亚洲人成网站777色婷婷| 亚洲在线视频观看| 国产区在线观看成人精品| 久久激情网站| 亚洲免费高清视频| 久久久久久久激情视频| 亚洲巨乳在线| 国产精品午夜国产小视频| 午夜欧美大尺度福利影院在线看| 免费看的黄色欧美网站| 夜夜嗨一区二区| 国产婷婷色一区二区三区| 嫩模写真一区二区三区三州| 日韩午夜激情av| 免费观看成人| 先锋影音国产一区| 亚洲国产精品久久精品怡红院| 欧美视频导航| 麻豆精品视频在线观看| 亚洲五月婷婷| 亚洲国产精品久久| 久久国产欧美精品| 亚洲视频综合在线| 亚洲国产高潮在线观看| 国产欧美视频一区二区| 亚洲久久一区二区| 国产午夜久久久久| 久热精品视频| 亚洲网在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 久久久久久久久蜜桃| 中日韩在线视频| 免费人成网站在线观看欧美高清| 亚洲自拍偷拍麻豆| 99精品国产在热久久| 精品1区2区3区4区| 亚洲尤物在线| 一本色道久久综合亚洲精品不 | 亚洲韩日在线|