2010-12-28 3 views
1

私はプールする必要があるクラスに必要な最小限の変更でメモリプール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 *引数から実際のプールのアドレスを取得する方法はわかりません。

代わりに、デストラクタに入れて解決しました。私は、クラスがプールを使用して割り当てられていることをコンストラクタが要求していることが分かります。これは、破壊が常に未割り当てを意味することを意味します。

これは最初の実用的な解決方法であり、使用するのが非常に便利です。しかし、これを行うのはおそらくスタイルが悪いことです。問題の解決策があれば私は不思議です。

誰か知っていますか?

+1

Modern C++ Designを読んでください:http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315 –

答えて

3

Poolable::operator newは、thepoolからメモリを割り当てて、通常の(配置されていない)newステートメントを使用できるようにすることもできます。あなたのソリューションでは、ユーザーは、これらのオブジェクトをいくつかの特殊なテクニックで割り当てなければならないことを覚えていなければなりません。詳細があまりにも多く、ユーザーコードに負担をかけることになります。

+0

ああ..私はかなり理解していません。 "演算子new"をプールからメモリを割り当てるようにしますか?すでにやっていることとは違う意味ですか? – kamziro

+0

kamziro:それ以上のプールを必要としない場合は、グローバル変数を宣言して 'operator new'を使ってください。 – sharptooth

+0

ああ、私は複数のプールを持つ予定ですが、そのアイデアに感謝します。 – kamziro

関連する問題