我正在为小型和非常常用的对象创建自己的内存池。我很擅长分配和分配本身。
这是我的游泳池的布局
class CPool
{
unsigned int m_uiBlocks;
unsigned int m_uiSizeOfBlock;
unsigned int m_uiFreeBlocks;
unsigned int m_uiInitialized;
unsigned char *m_pMemStart;
unsigned char *m_pNext;
public:
CPool();
~CPool();
void CreatePool(size_t sizeOfEachBlock, unsigned int numOfBlocks);
void DestroyPool();
unsigned char* AddrFromIndex(unsigned int i) const;
unsigned int IndexFromAddr(const unsigned char* p) const;
void* Allocate();
void DeAllocate(void* p);
};
我希望每个班级都有自己的游泳池。现在,如果某个类需要使用此池,则需要
CreatePool()
的大小和no_of_objects new
& delete
或重载运算符,并从那些函数中调用Allocate
和DeAllocate
函数。我更担心像Derived *derObj = new (poolObj)Derived();
这样的电话。在这里,用户可能会忘记poolObj
,并且该对象根本不在我的堆上。当然,为了实现这个目的,我有像
inline void* operator new(size_t size, CPool& objPool)
{
return objPool.Allocate();
}
所以我想问一些具体的问题:
如何重新设计我的池类,以便客户端调用
Derived *derObj = new Derived();
我有机会从我的池中分配内存。它甚至可能吗?
有没有办法识别对象的type
?那样CreatePool
和
DestroyPool
也可以从客户端代码中删除?但我需要非常小心,每种类型只有一个游泳池'
我也准备使用模板化代码,但我不确定要模板化什么。请建议。