2

小さくて頻繁に使用されるオブジェクト用に独自のメモリ プールを作成しています。私は割り当てとd-割り当て自体に精通しています。

これが私のプールのレイアウトです

class CPool
{ 
    unsigned int        m_uiBlocks;     
    unsigned int        m_uiSizeOfBlock;    
    unsigned int        m_uiFreeBlocks; 
    unsigned int        m_uiInitialized;    
    unsigned char      *m_pMemStart;        
    unsigned char      *m_pNext;            

    public:
            CPool();
            ~CPool();

            void                CreatePool(size_t sizeOfEachBlock,  unsigned int numOfBlocks);
            void                DestroyPool();

            unsigned char*      AddrFromIndex(unsigned int i) const;
            unsigned int        IndexFromAddr(const unsigned char* p) const;

            void*               Allocate();
            void                DeAllocate(void* p);
};

各クラスに独自のプールが必要です。いくつかのクラスがこのプールを使用する必要がある場合、

  1. CreatePool()size と no_of_objects で呼び出します
  2. これらは、パラメータ化されたnew&deleteまたはオーバーロード演算子を呼び出し、それらからAllocateandDeAllocate関数を呼び出します。
  3. 「DestroyPool()」を呼び出します

のような電話の方が心配ですDerived *derObj = new (poolObj)Derived();。ここでユーザーは忘れる可能性がpoolObjあり、そのオブジェクトは私のヒープにまったくありません。もちろん、これが機能するために、次のようなグローバル関数があります

inline void* operator new(size_t size, CPool&  objPool)
{
    return objPool.Allocate();
}

だから私は具体的な質問をしたいと思います:

  1. Derived *derObj = new Derived();クライアントが呼び出した場合にプールからメモリを割り当てる機会があるように、プール クラスを再設計するにはどうすればよいですか 。それは可能ですか?

  2. typeオブジェクトを認識する方法はありますか? では、クライアント コードから削除することCreatePoolDestroyPoolできますか? ただし、「タイプ」ごとにプールが 1 つしかないことに注意する必要があります。

テンプレート化されたコードも使用する準備ができていますが、何をテンプレート化すればよいかわかりません。提案してください。

4

0 に答える 0