小さくて頻繁に使用されるオブジェクト用に独自のメモリ プールを作成しています。私は割り当てと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);
};
各クラスに独自のプールが必要です。いくつかのクラスがこのプールを使用する必要がある場合、
CreatePool()
size と no_of_objects で呼び出します- これらは、パラメータ化された
new
&delete
またはオーバーロード演算子を呼び出し、それらからAllocate
andDeAllocate
関数を呼び出します。 - 「DestroyPool()」を呼び出します
のような電話の方が心配ですDerived *derObj = new (poolObj)Derived();
。ここでユーザーは忘れる可能性がpoolObj
あり、そのオブジェクトは私のヒープにまったくありません。もちろん、これが機能するために、次のようなグローバル関数があります
inline void* operator new(size_t size, CPool& objPool)
{
return objPool.Allocate();
}
だから私は具体的な質問をしたいと思います:
Derived *derObj = new Derived();
クライアントが呼び出した場合にプールからメモリを割り当てる機会があるように、プール クラスを再設計するにはどうすればよいですか 。それは可能ですか?type
オブジェクトを認識する方法はありますか? では、クライアント コードから削除することCreatePool
もDestroyPool
できますか? ただし、「タイプ」ごとにプールが 1 つしかないことに注意する必要があります。
テンプレート化されたコードも使用する準備ができていますが、何をテンプレート化すればよいかわかりません。提案してください。