1

因此,我正在研究一种方法来轻松地对 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 调用(基本上释放池的一部分)放在 delete 运算符中,但不知道如何从 void* 参数中获取实际池的地址。

相反,我通过将它放入析构函数来解决。我认为构造函数要求使用池分配类,这意味着销毁总是意味着随后将取消分配。

这是第一个可行的解决方案,使用起来非常方便。但是,这样做可能是不好的风格,我很好奇是否有更好的解决方案。

有人知道吗?

4

1 回答 1

3

另一种方法是Poolable::operator new分配内存,thepool以便您可以使用通常的(非放置)new语句。在您的解决方案中,用户必须记住,这些对象将通过某种特殊技术进行分配,这会显示太多细节并给用户代码带来太多负担。

于 2010-12-28T12:06:44.780 回答