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からメモリを割り当てることです。ソリューションでは、ユーザーは、これらのオブジェクトが特別な手法で割り当てられることを覚えておく必要があります。これは、詳細が多すぎて、ユーザーコードに負担がかかりすぎることを意味します。thepoolnew

于 2010-12-28T12:06:44.780 に答える