Создать кучу по определенному адресу памяти для динамического выделения памяти

Есть ли способ создать кучу в определенной области памяти (отдельно от системной кучи), которая может использоваться для динамического выделения памяти, но использует динамический распределитель памяти, встроенный в библиотеку 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).

2

Решение

Развертывание вашего собственного распределителя не так уж сложно и во многих отношениях может быть весьма поучительным.
Сначала вам нужно выяснить, какой тип распределения / освобождения вы хотите поддерживать в этой куче. Для общего использования вполне хороши распределители, подобные 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];
1

Другие решения

Наконец-то я наткнулся на блог Эли Бендерского, который иллюстрирует именно то, что я искал. memmgr — распределитель памяти с фиксированным пулом

0

По вопросам рекламы [email protected]