1

単純なロジックに従うメモリプールの実装を作成することは可能ですか?

1-nバイト相当のメモリプールを割り当てます。

2-変更されたnew();を使用します。メモリを割り当てない関数/演算子は、メモリプールの先頭へのポインタのみを取得します。このようにして、オブジェクトはオーバーヘッドなしで動的に作成されます。

3-メモリプールが少なくなると、残りのメモリプールの割り当てが解除され、新しいメモリプールが割り当てられます

4-最初のメモリプールで作成されたオブジェクトは、サイズに基づいてメモリを取得するために残されます。最初のプールに割り当てられたものと、プールが少なくなったときに返されるものの違いは、オブジェクトが削除されると復元されます。

私の心配は主に、割り当てられたよりも小さいメモリプールを削除する方法がわからないという事実です。メモリプールオブジェクトの最後に残っているものの他に、メモリプールのOSヘッダーもあることに注意してください。これは、プールに割り当てられた最初のオブジェクトの前にあります。メモリがリークされていないこと、余分なメモリプールを削除しても、そこに割り当てられているオブジェクトが削除されないこと、メモリプールフラグメントのヘッダーが安全に削除されることを確認するには、どのようなアプローチが必要ですか。

ありがとう!

編集:意図は、メモリがメモリプールによって割り当てられ、オブジェクトによって解放されることであることに注意してください。オブジェクトは、ライフタイムが異なる場合があります。これが可能であれば...

4

1 に答える 1

3

まず、何を検索すべきかを知りたい場合、これはアリーナアロケーターのように聞こえます(コメントに記載されています)。

アリーナは、すべてを一度に破棄することを計画している場合にのみ本当に役立つことに注意してください。削除されたオブジェクトからメモリを再利用するために再利用する場合は、アリーナの上に独自のヒープを書き込むことになります。最後のオブジェクトの割り当てが解除されるまでアリーナチャンクを存続させたい場合は、refcountを使用して管理できます。

次に、(reallocのように)後で移動せずに縮小できるメモリを割り当てるために私が知っている唯一の一般的な方法は、メモリマップを使用することです。これはプラットフォーム固有です。

于 2012-01-16T13:53:47.367 に答える