私はプールする必要があるクラスに必要な最小限の変更でメモリプールC++オブジェクトに簡単に取り組んでいました。サブクラス化による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 *引数から実際のプールのアドレスを取得する方法はわかりません。
代わりに、デストラクタに入れて解決しました。私は、クラスがプールを使用して割り当てられていることをコンストラクタが要求していることが分かります。これは、破壊が常に未割り当てを意味することを意味します。
これは最初の実用的な解決方法であり、使用するのが非常に便利です。しかし、これを行うのはおそらくスタイルが悪いことです。問題の解決策があれば私は不思議です。
誰か知っていますか?
Modern C++ Designを読んでください:http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315 –