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

基于ACE實現(xiàn)的一個內(nèi)存池

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

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

        優(yōu)點:
        1、不存在realloc,緩沖地址固定不變;
        2、緩沖池大小由小變大,動態(tài)增長,不是一開始就分配一個超大的內(nèi)
        存,真正按需分配;
        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;
                }

            }

        }
;

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

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

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


        
/// 分配一個塊內(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)
            
{
                
// 分配另一個數(shù)據(jù)鏈
                CacheChain* newChain = CacheChain::create(_ChainList, _BlockSize, _BlockCount);

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

                
// 定位到最后一個節(jié)點
                (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;
            }

        }

    }
;



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

    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ù)分配的對象的數(shù)目
        size_t getObjectCount() const
        
{
            
return _Pool.getBlockCount();
        }


        
/// 創(chuàng)建對象的內(nèi)存空間,但是沒有進行構(gòu)造,用戶可以自行進行定制的構(gòu)造
        T* alloc()
        
{
            
void* obj = _Pool.alloc();
            ::
new (obj) T(/* not args */); // 進行默認構(gòu)造
            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 閱讀(3028) 評論(0)  編輯 收藏 引用 所屬分類: C++技術(shù)

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

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(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>
            91久久久精品| 国产精品国产馆在线真实露脸| 欧美www在线| 久久一区二区三区四区| 你懂的视频一区二区| 亚洲缚视频在线观看| 米奇777超碰欧美日韩亚洲| 麻豆91精品91久久久的内涵| 久久久久久一区| 亚洲第一精品福利| 亚洲精品免费在线观看| 一区二区三区精品国产| 午夜久久一区| 欧美91大片| 国产精品极品美女粉嫩高清在线| 国产美女精品在线| 亚洲国产一区视频| 亚洲午夜精品福利| 美女黄毛**国产精品啪啪 | 久久久久久久久久码影片| 久久亚洲精品视频| 这里只有精品视频| 久久综合成人精品亚洲另类欧美| 欧美人与禽性xxxxx杂性| 国产精品一二一区| 亚洲激情欧美| 久久精品国产免费看久久精品| 亚洲国产日韩美| 中文成人激情娱乐网| 久久偷窥视频| 国产精品色在线| 亚洲美女在线一区| 久久综合网络一区二区| 亚洲一区二区三区精品视频 | 99ri日韩精品视频| 久久婷婷国产综合尤物精品| 国产精品xxxxx| 亚洲国产一区在线观看| 久久久福利视频| 亚洲一区二区三区视频播放| 欧美激情中文字幕乱码免费| 国内综合精品午夜久久资源| 亚洲欧美在线另类| 日韩视频久久| 欧美激情在线免费观看| 亚洲国产一区二区三区青草影视 | 国产精品自在线| 一区二区三区四区蜜桃| 亚洲国产日本| 免费成人av资源网| 亚洲成在线观看| 久久久久国产精品www| 亚洲欧美激情精品一区二区| 国产精品久久二区二区| 亚洲一区精品视频| 亚洲视频网在线直播| 欧美日韩一卡| 亚洲午夜一区二区| 久久久久.com| 国产午夜精品在线| 欧美一级在线视频| 日韩一区二区电影网| 欧美日韩第一页| 国产精品99久久99久久久二8| 亚洲人成网站777色婷婷| 欧美成人免费va影院高清| 亚洲国产精品一区二区久| 卡通动漫国产精品| 美女黄网久久| 一本在线高清不卡dvd| 一区二区高清视频| 国产欧美一区二区三区久久| 久久精品国产一区二区电影| 久久精品盗摄| 亚洲国产综合91精品麻豆| 亚洲国产精品ⅴa在线观看| 欧美日韩高清区| 亚洲免费视频中文字幕| 欧美一区国产一区| 91久久精品国产91久久性色| 亚洲久久一区| 国产一区二区三区观看| 欧美成人综合在线| 欧美日韩视频不卡| 久久久久久黄| 欧美日韩精品免费看| 欧美在线观看视频一区二区三区| 久久精品夜色噜噜亚洲aⅴ | 久久精品一区二区三区不卡牛牛| 久久国产精品久久久久久| 亚洲国产精品欧美一二99| 夜夜嗨网站十八久久| 国内成人精品视频| 亚洲人成7777| 国产专区欧美精品| 日韩一级不卡| 在线欧美三区| 亚洲午夜精品久久久久久app| 在线观看亚洲视频| 亚洲午夜久久久久久久久电影院| 极品少妇一区二区| 亚洲午夜精品17c| 亚洲国产日本| 欧美一区二区视频97| 9人人澡人人爽人人精品| 欧美夜福利tv在线| 亚洲私人影院| 母乳一区在线观看| 久久免费99精品久久久久久| 欧美日韩一区二区三区在线看| 久久一区二区三区国产精品| 国产精品久久久久久久久久妞妞| 欧美不卡一区| 国内精品**久久毛片app| 久久国产精品一区二区三区四区 | 一区二区三区精品视频| 久久手机免费观看| 午夜日韩在线| 可以看av的网站久久看| 亚洲视频一区二区免费在线观看| 久久久久久久综合| 亚洲亚洲精品在线观看| 欧美成人午夜影院| 美女图片一区二区| 一本一本久久a久久精品综合妖精| 好看的日韩视频| 亚洲欧美在线一区二区| 亚洲欧美999| 欧美日韩免费网站| 亚洲乱码国产乱码精品精可以看 | 中文一区在线| 中文高清一区| 欧美日在线观看| 日韩一级免费观看| 亚洲视频在线观看视频| 欧美日韩国产成人高清视频| 亚洲第一区在线观看| 亚洲电影在线看| 免费在线亚洲| 亚洲国产精品传媒在线观看| 亚洲欧洲在线一区| 欧美高清在线播放| 亚洲日韩中文字幕在线播放| 日韩亚洲欧美在线观看| 欧美经典一区二区三区| 日韩视频在线免费| 亚洲伊人网站| 国产视频精品免费播放| 久久久久久久波多野高潮日日| 久久九九精品| 亚洲七七久久综合桃花剧情介绍| 猛干欧美女孩| 亚洲精品国产日韩| 性久久久久久久久| 一区二区三区在线免费播放| 欧美 日韩 国产一区二区在线视频| 亚洲国产日韩一区| 亚洲影视在线| 精品粉嫩aⅴ一区二区三区四区| 久久只精品国产| 亚洲最新视频在线| 久久国产精品第一页| 亚洲高清视频在线观看| 欧美另类久久久品| 亚洲欧美制服另类日韩| 亚洲国产精品国自产拍av秋霞| 亚洲午夜影视影院在线观看| 国产午夜精品在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久国产加勒比精品无码| 亚洲大片av| 欧美亚洲系列| 亚洲精品一区二区三区av| 欧美一区午夜精品| 男男成人高潮片免费网站| 一区二区三区日韩欧美| 国产情人节一区| 欧美精品一区二区视频| 欧美在现视频| 国产乱肥老妇国产一区二| 久久久久久午夜| 亚洲视频在线观看三级| 欧美成黄导航| 欧美一区二区成人| 日韩午夜在线电影| 激情一区二区| 国产欧美韩国高清| 欧美日韩精品综合在线| 久久久免费精品视频| 亚洲一区二区在线视频| 日韩视频在线一区二区| 欧美成人r级一区二区三区| 欧美一区视频| 亚洲一区日韩在线| 夜夜嗨av一区二区三区| 亚洲人成人一区二区在线观看| 国产一区二区精品久久| 国产精品青草综合久久久久99| 欧美美女喷水视频| 免费日韩av电影|