Итак, я легко работал с объектами пула памяти C++ с минимальными изменениями, необходимыми для класса, который необходимо объединить.Пул памяти C++ по подклассу
сам пул памяти является стандартным разнообразием вы можете найти в любом месте, но я сделал этот класс:
Poolable::Poolable(MemPool& lepool){
mempool = &lepool;
}
Poolable::~Poolable(){
mempool->returnMemory((char*)this);
}
void * Poolable::operator new(size_t size, MemPool& lepool){
if(!lepool.initialised())
lepool.initializeBasedOnSize(size);
return lepool.getMemory(size);
}
void Poolable::operator delete(void * p){
// do absolutely NOTHING
}
использование:
class SomeSubclass : public Poolable { /* boring details here */ };
MemPool thepool(1000);
SomeSubclass * woot = new(thepool) SomeSubclass(thepool);
Я хотел поставить вызов returnMemory (который в основном освобождает часть пула) в операторе удаления, но понятия не имеет, как получить адрес фактического пула из аргумента void *.
Вместо этого, я решил, поставив его в деструктор. Я полагаю, что конструктор требует, чтобы класс был распределен с использованием пула, а это означает, что уничтожение всегда подразумевает, что последует нераспределение.
Это первое рабочее решение, и его вполне удобно использовать. Однако делать это, вероятно, плохой стиль, и мне любопытно, есть ли лучшие решения проблемы.
Кто-нибудь знает об этом?
Прочитайте современный дизайн на C++: http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315 –