Пул памяти C ++ с помощью подклассов - PullRequest
1 голос
/ 28 декабря 2010

Итак, я легко работал над пулированием объектов 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 Ответ

3 голосов
/ 28 декабря 2010

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

...