Кастомные аллокаторы памяти

126
22 октября 2021, 00:00

Читал статью про кастомные аллокаторы, но не могу понять, как они выделяют память именно на куче, разве есть какой-то способ взять память на куче, кроме malloc/new? Или в функцию передается большой кусок памяти?

typedef struct _LinearBuffer {

uint8_t *mem;       /*!< Pointer to buffer memory. */
uint32_t totalSize; /*!< Total size in bytes. */
uint32_t offset;    /*!< Offset. */
} LinearBuffer;
/* non-aligned allocation from linear buffer. */
void* linearBufferAlloc(LinearBuffer* buf, uint32_t size) {

if(!buf || !size)
return NULL;

uint32_t newOffset = buf->offset + size;
if(newOffset <= buf->totalSize) {
void* ptr = buf->mem + buf->offset;
buf->offset = newOffset;
return ptr;
}
return NULL; /* out of memory */
}
Answer 1

Суть работы LinearAllocator следующая

  1. Выделение куска памяти в куче
LinearAllocator la(64); //malloc
|________________________________| (64byte)  A
  1. Получение куска памяти с под А. Построение объекта Object
Object * obj1  = new(static_cast<Object*>(la.allocate(sizeof(Object)))) Object;
|оbj1|___________________________|
  1. И так, дальше можем заполнять кусок памяти
|obj1|obj2|obj3|_________________|

Помните, что LinearAllocator может очистить только весь кусок памяти, то есть удалить только obj3 не получится (Stack Allocator умеет).

Деструктор нужно вызывать явно.

 obj1->~Obj();
 obj2->~Obj();
 obj3->~Obj();

Плюсы: Внутренняя фрагментация сведена к минимуму(Пространственая локальность).

Минусы: Нет контроля объектов.

READ ALSO
Сортировка двоичного (бинарного) дерева

Сортировка двоичного (бинарного) дерева

Хочу написать двоичное дерево для хранения строкКак упрощенная задача - нужно отсортировать дерево на одном уровне

101
Segmentation fault. Найти строку, содержащую запись самого большого целого числа в десятичной системе

Segmentation fault. Найти строку, содержащую запись самого большого целого числа в десятичной системе

В коде много "странностей", но основная ошибка в том, что в функции поиска вы почему-то обращаетесь к text[column]Это, разумеется, совершенно не правильно

101
Call of overloaded is ambiguous при реализации своего алгоритма copy

Call of overloaded is ambiguous при реализации своего алгоритма copy

Есть самописное подобие stlСуть задачи - вектор пар (тоже самописные)

202
C++ Считалка. Проблема с зацикливанием

C++ Считалка. Проблема с зацикливанием

Пишу код под задачу со считалкой в строке и одномерным массивом с людьмиЧерез поток делю строку на слова и через while выполняю считалку один...

244