這個對象池相當小巧,支持加鎖以方便支持線程安全,當然了,如果在單線程中使用,可以指定一個偽鎖。
這個對象池並不能解決內存碎片問題,只是用空間換時間。這個代碼相當簡短,一看就明白,所以不寫用例了。還有這個鎖的代碼就不貼了,因為鎖的樣式各有不同,還有避免跑題,避免喧賓奪主。
上代碼:
不夠150字不允許發布到首頁候選區,好坑。那為夠150字,那就來段簡單用例
int main()
{
objpool<int> _intpool;
int* p = _intpool.alloc();
int* p2 = _intpool.alloc();
_intpoll.dealloc(p);
int* p3 = _intpool.alloc();
return 0;
}
其實這個例子舉的不好,
夠150沒?
#ifndef OBJPOOL_INCLUDE
#define OBJPOOL_INCLUDE
#include "pool_config.hpp"
#include "lock/lock.hpp"
POOL_NAMESPACE_BEGIN
typedef locklib::scopedlock scopedlock;
template<class T,class LockMode=locklib::fakelock>
class objpool
{
public:
objpool()
{
_numalloc = 0;
_elemsize = (sizeof(T)>sizeof(T*)) ? sizeof(T) : sizeof(T*);
_listhead = NULL;
}
~objpool()
{
while(_listhead)
{
T* ret = _listhead;
_listhead = *(reinterpret_cast<T**>(_listhead));
::free(ret);
}
}
int getCount()const
{
return _numalloc;
}
T *alloc()
{
T* ret = _alloc();
return new(ret)T();
}
template<class P>
T *alloc(const P& p)
{
T* ret = _alloc();
return new(ret)T(p);
}
template<class P1, class P2>
T *alloc(const P1& p1, const P2& p2)
{
T* ret = _alloc();
return new(ret)T(p1,p2);
}
template<class P1, class P2, class P3>
T *alloc(const P1& p1, const P2& p2, const P3& p3)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3);
}
template<class P1, class P2, class P3, class P4>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4);
}
template<class P1, class P2, class P3, class P4, class P5>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5);
}
template<class P1, class P2, class P3, class P4, class P5, class P6>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6);
}
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6,p7);
}
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6,p7,p8);
}
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6,p7,p8,p9);
}
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class P10>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9, const P10& p10)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10);
}
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class P10, class P11>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9, const P10& p10,const P11& p11)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11);
}
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class P10, class P11, class P12>
T *alloc(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9, const P10& p10,const P11& p11,const P12& p12)
{
T* ret = _alloc();
return new(ret)T(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12);
}
void dealloc(T* elem)
{
scopedlock lock(&_lock);
elem->~T();
memset(elem, 0xfe, _elemsize);
_numalloc--;
*(reinterpret_cast<T**>(elem)) = _listhead;
_listhead = elem;
}
protected:
T* _alloc()
{
scopedlock lock(&_lock);
T* ret = 0;
_numalloc++;
if(_listhead == NULL)
{
ret = (T*)malloc(_elemsize);
}
else
{
ret = _listhead;
_listhead = *(reinterpret_cast<T**>(_listhead));
}
memset(ret,0xfe,_elemsize);
return ret;
}
protected:
int _numalloc; ///< number of elements currently allocated through this ClassPool
size_t _elemsize; ///< the size of each element, or the size of a pointer, whichever is greater
T * _listhead; ///< a pointer to a linked list of freed elements for reuse
LockMode _lock;
};
POOL_NAMESAPCE_END
#endif