Я создаю свой собственный пул памяти для небольших и очень часто используемых объектов. У меня все хорошо с распределением и само распределением.
Вот макет моего бассейна
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_objectsnew
& 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
также можно удалить из кода клиента? Но мне нужно быть очень осторожным, чтобы в каждом «типе» был только один пул.
Я также готов использовать шаблонный код, но я не уверен, что шаблонизировать. Пожалуйста, предложите.
Задача ещё не решена.