2010-12-28 2 views
1

Итак, я легко работал с объектами пула памяти 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 *.

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

Это первое рабочее решение, и его вполне удобно использовать. Однако делать это, вероятно, плохой стиль, и мне любопытно, есть ли лучшие решения проблемы.

Кто-нибудь знает об этом?

+1

Прочитайте современный дизайн на C++: http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315 –

ответ

3

Альтернативой является то, что Poolable::operator new выделяет память от thepool, так что вы можете использовать обычные (не размещаемые) операторы new. В вашем решении пользователь должен помнить, что эти объекты должны быть выделены с помощью специальной техники, что показывает слишком много деталей и слишком много нагрузки на код пользователя.

+0

Ах .. Я не совсем понимаю ... не могли бы вы рассказать о том, что вы имеете в виду? с тем, чтобы «оператор новый» выделял память из пула? Вы имеете в виду по-другому, чем то, что оно уже делает? – kamziro

+0

kamziro: Если вам не нужно больше одного пула, вы можете просто объявить глобальную переменную и использовать 'operator new'. – sharptooth

+0

О, да, я планирую иметь более одного пула, но спасибо за эту идею. – kamziro