因此,我正在研究一种方法来轻松地对 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* 参数中获取实际池的地址。
相反,我通过将它放入析构函数来解决。我认为构造函数要求使用池分配类,这意味着销毁总是意味着随后将取消分配。
这是第一个可行的解决方案,使用起来非常方便。但是,这样做可能是不好的风格,我很好奇是否有更好的解决方案。
有人知道吗?