今天在看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