Skip to content
Sven Bieg edited this page Dec 26, 2024 · 41 revisions

Heap

The heap is the dynamic memory of the application. It allows the user to allocate and free memory at runtime.


Creation

heap_t* heap_create(size_t offset, size_t size);

A small header get's stored right at the beginning:

typedef struct
{
size_t free;
size_t used;
size_t size;
size_t free_block;
size_t map_free;
}heap_t;

Allocation

void* heap_alloc(heap_t* heap, size_t size);

If there is a gap big enough, it is found in the map. Else a new heap_block is created at the end of the heap.



The size and a flag if it is free are stored twice at the head and the foot. This is neccessary to combine free blocks next to each other.


Deletion

void heap_free(heap_t* heap, void* buf);

The block is added to the map and marked free. If there are free blocks left or right of it, those get removed from the map and a combined block is added.


Map

Free blocks are sorted by size and by offset.


https://github.com/svenbieg/Clusters


Internal Allocation

Adding a free block to the map can cause an allocation, the opposite when removing. It is possible by caching releases in free blocks, and making allocations passive without moving anything in the map.



Clone this wiki locally