Вопрос

Поэтому я легко работал над объектами пула памяти 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);

Я хотел поместить вызов возврата (который в основном освобождает часть бассейна) в оператор Delete, но понятия не имею, как получить фактический адрес бассейна из аргумента void*.

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top