そのため、プールする必要のあるクラスに最小限の変更を加えるだけで、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*引数から実際のプールのアドレスを取得する方法がわかりません。
代わりに、デストラクタに入れて解決しました。コンストラクターは、クラスがプールを使用して割り当てられることを義務付けていると思います。つまり、破棄は常に割り当て解除が続くことを意味します。
これは最初の実用的なソリューションであり、使用するのに非常に便利です。しかし、それを行うのはおそらく悪いスタイルであり、問題に対するより良い解決策があるかどうか私は興味があります。
誰か知っていますか?