2

動的メモリ割り当てに使用できる特定のメモリ位置 (システム ヒープとは別) にヒープを作成する方法はありますが、C ライブラリに組み込まれている動的メモリ アロケータを使用します。

これと機能的に同等のものを探しています:

UserHeap heap(startAddress, size);

void* allocatedMemory1 = heap.Allocate(100);  //Allocate 100 bytes.
void* allocatedMemory2 = heap.Allocate(200);  //Allocate 200 bytes.

/* ... Do seomthing useful with the memory ... */

heap.Free(allocatedMemory1);
heap.Free(allocatedMemory2);

このuheap.hには探しているものが含まれているようですが、これは newlib には存在しないようです。GCCまたはnewlibに何かがあるのではないかと思っています。そうでない場合は、 ptmallocを移植することになると思います。ただし、このコードは既に C ライブラリにあることを理解しており、それを再現するためにメモリを無駄にしたくありません。

Sourcery Codebench Lite (GCC) と newlib (C ライブラリ) を使用しています。

4

2 に答える 2

1

独自のアロケータを展開することはそれほど難しくなく、多くの点で非常に有益です。まず、そのヒープでサポートする割り当て/割り当て解除パターンの種類を把握する必要があります。一般的な用途では、dlmalloc (Doug Lea の) に似たアロケータが非常に優れています。特定の用途にはさらに多くの種類があります: スタック ベース (空きは常に最後に割り当てられた解放されていないメモリ ブロックのアドレス)、固定サイズ ベース (返されるメモリが固定サイズに分割される)、キュー ベース、小さなブロックなど

これらのほとんどは、内部アロケーターも持つことができます。たとえば、固定サイズのアロケーターがあると仮定すると、(2 番目のアロケーターまたはシステムから) X バイトのブロックで割り当て、Y のブロックに分割するように指示できます。バイト。サイズ Y バイトのチャンクへのポインターが返されますが、空きブロックがない場合は、サイズ X の新しいブロックを割り当てて分割します。

便宜上、new/delete 演算子をグローバルに、または特定のクラスに実装して、その割り当てをカスタム アロケーターにリダイレクトすることもできます。ヒープに new を配置することも便利です。以下を参照してください。

個人的には、追加のデバッグ情報 (関数/行/その他) を非常に簡単に追加できるマクロの使用を好みます。すなわち:

#define CUSTOM_NEW(Heap) new(Heap, __FUNCTION__, __LINE__)
int* ptr = CUSTOM_NEW(someHeap) int[32];
于 2012-11-03T22:41:04.753 に答える
0

私は最終的に、まさに私が探していたものを説明している Eli Bendersky のブログに出くわしました。 memmgr – 固定プール メモリ アロケータ

于 2012-11-17T01:45:33.243 に答える