我正在为小型且非常常用的对象创建自己的内存池。我对分配和 d 分配本身很满意。
这是我的游泳池的布局
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()
用 size 和 no_of_objects调用 - 他们要么调用参数化
new
&delete
或重载运算符,然后调用这些运算符Allocate
和DeAllocate
函数。 - 调用'DestroyPool()'
我更担心像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
可以从客户端代码中删除?但我需要非常小心,每种“类型”只有一个池。
我也准备好使用模板化代码,但我不确定要模板化什么。请建议。