Общий пул памяти — как? — Дизайн Проблема

Я создаю свой собственный пул памяти для небольших и очень часто используемых объектов. У меня все хорошо с распределением и само распределением.

Вот макет моего бассейна

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 или перегрузить операторов и позвонить Allocate а также DeAllocate функции от тех.
  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 объекта? Чтобы CreatePool а также
    DestroyPool также можно удалить из кода клиента? Но мне нужно быть очень осторожным, чтобы в каждом «типе» был только один пул.

Я также готов использовать шаблонный код, но я не уверен, что шаблонизировать. Пожалуйста, предложите.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]