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