簡體   English   中英

在特定的內存地址上創建堆以進行動態內存分配

[英]Create a heap at a specific memory address for dynamic memory allocation

有沒有一種方法可以在特定的內存位置(與系統堆分開)創建一個堆,該堆可以用於動態內存分配,但是可以利用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庫)一起使用。

推出自己的分配器並不難,並且在許多方面都可以提供啟發。 首先,您需要確定要在該堆中支持哪種分配/取消分配模式。 對於一般用途,類似於dlmalloc(Doug Lea's)的分配器非常好。 對於特定用途,還有更多種類:基於堆棧(其中,空閑始終是最后分配的未釋放內存塊的地址),基於固定大小(將內存划分為返回的固定大小),基於隊列,小塊等

其中的大多數也可以有一個內部分配器,例如,假設您有一個固定大小的分配器,可以告訴它以X字節的塊分配(從第二個分配器或從系統),然后將其分成Y個塊字節。 返回指向大小為Y字節的塊的指針,但是當沒有空閑塊時,可以分配一個大小為X的新塊並將其分割。

為了方便起見,您還可以全局或在某些類上實現new / delete運算符,以將其分配重定向到您的自定義分配器。 在堆上放置新的東西也很方便,請參見下文。

我個人更喜歡使用宏,因為它允許輕松添加額外的調試信息(功能/行/等)。 即:

#define CUSTOM_NEW(Heap) new(Heap, __FUNCTION__, __LINE__)
int* ptr = CUSTOM_NEW(someHeap) int[32];

最終,我遇到了Eli Bendersky撰寫的博客,該博客准確地說明了我在尋找什么。 memmgr –固定池內存分配器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM