通用内存池 - 如何? - 设计问题

时间:2014-12-09 09:37:37

标签: c++ templates operator-overloading new-operator memory-pool

我正在为小型和非常常用的对象创建自己的内存池。我很擅长分配和分配本身。

这是我的游泳池的布局

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()的大小和no_of_objects
  2. 他们要么调用参数化new& delete或重载运算符,并从那些函数中调用AllocateDeAllocate函数。
  3. call' DestroyPool()'
  4. 我更担心像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也可以从客户端代码中删除?但我需要非常小心,每种类型只有一个游泳池'

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

0 个答案:

没有答案