通过子类化的 C++ 内存池

标签 c++ memory-pool

因此,我正在研究一种方法,只需对需要池化的类进行最少的修改,即可轻松地对 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* 参数中获取实际池的地址。

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

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

有人知道吗?

最佳答案

另一种方法是让 Poolable::operator newthepool 分配内存,这样您就可以使用通常的(非放置)new 声明。在您的解决方案中,用户必须记住,这些对象是通过某种特殊技术分配的,这显示了太多细节,给用户代码带来了太多负担。

关于通过子类化的 C++ 内存池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4545883/

相关文章:

c++ - 如何完全管理 std 容器(如 map)的堆内存分配?

c++ - boost::pool 实内存分配

c++ - 从空指针初始化类/结构

c - 对于通用内存池,如何在 C 中的指针之间自由转换?

c++ - 警告 : derived class's member variable is initialized after base class

c++ - CreateRemoteThread() 成功但不执行任何操作

c++ - 内存重新对齐后重新对齐指针

python - 干净地实现运行时动态链接

c++ - 仅允许某些派生类访问基类的成员函数

c++ - SFINAE 上的默认参数值