2

我正在为小型且非常常用的对象创建自己的内存池。我对分配和 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);
};

我希望每个班级都有自己的游泳池。现在,如果某个类需要使用这个池,则需要

  1. 他们CreatePool()用 size 和 no_of_objects调用
  2. 他们要么调用参数化new&delete或重载运算符,然后调用这些运算符AllocateDeAllocate函数。
  3. 调用'DestroyPool()'

我更担心像Derived *derObj = new (poolObj)Derived();. 在这里用户可能会忘记poolObj,并且该对象根本不会在我的堆上。当然,为此,我具有全局功能,例如

inline void* operator new(size_t size, CPool&  objPool)
{
    return objPool.Allocate();
}

所以我想问一些具体的问题:

  1. 如何重新设计我的池类,以便如果客户调用 Derived *derObj = new Derived();我有机会从我的池中分配内存。甚至可能吗?

  2. 有没有办法识别type物体?那么,CreatePoolDestroyPool可以从客户端代码中删除?但我需要非常小心,每种“类型”只有一个池。

我也准备好使用模板化代码,但我不确定要模板化什么。请建议。

4

0 回答 0