HAllocator
A Simple C++ Memory Allocator
Loading...
Searching...
No Matches
basic_alloc.hpp
Go to the documentation of this file.
1
21#pragma once
22#include <unistd.h>
23
24#include <climits>
25#include <cstdio>
26#include <cstring>
27#include <iostream>
28#include <stdexcept>
29
30namespace hh::basic_alloc {
32using MemSizeT = unsigned long long;
33
36
38constexpr MemSizeT BLOCK_SIZE = 4096;
39
59
61constexpr MemSizeT MEM_NODE_SIZE = sizeof(MemNode);
62
64extern MemNode *__head, *__tail;
65
71bool is_free(MemSizeT& size);
72
78void make_free(MemSizeT& size);
79
85void make_used(MemSizeT& size);
86
93
102
111
126void* sbrk_then_alloc(MemSizeT size);
127
140void coalesce_nodes(MemNode* nd);
141
155void* free(void* ptr);
156
171void shrink_then_align(MemNode* nd, MemSizeT size);
172
188void* try_alloc(MemSizeT size);
189
200void mem_copy(void* dest, const void* src, size_t n);
201
218void* try_realloc(void* ptr, MemSizeT size);
219
229void mem_set(void* ptr, int value, size_t num);
230
242void* try_calloc(size_t num, size_t size);
243
252void alloc_print();
253}; // namespace hh::basic_alloc
Definition basic_alloc.cpp:25
void alloc_print()
Print allocation status table for debugging.
Definition basic_alloc.cpp:399
MemSizeT sub(MemSizeT a, MemSizeT b)
Subtract two sizes (clearing free bits first).
Definition basic_alloc.cpp:84
MemNode * __tail
Definition basic_alloc.cpp:28
void * try_realloc(void *ptr, MemSizeT size)
Reallocate a memory block to a new size.
Definition basic_alloc.cpp:322
MemNode * __head
Pointer to the head of the memory block linked list.
Definition basic_alloc.cpp:28
MemSizeT add(MemSizeT a, MemSizeT b)
Add two sizes (clearing free bits first).
Definition basic_alloc.cpp:72
void * try_calloc(size_t num, size_t size)
Allocate and zero-initialize an array.
Definition basic_alloc.cpp:371
void * free(void *ptr)
Free a memory block and merge with adjacent free blocks.
Definition basic_alloc.cpp:195
void mem_copy(void *dest, const void *src, size_t n)
Copy n bytes from source to destination.
Definition basic_alloc.cpp:298
void coalesce_nodes(MemNode *nd)
Merge a free node with adjacent free nodes.
Definition basic_alloc.cpp:141
constexpr MemSizeT MEM_NODE_SIZE
Size of the MemNode structure.
Definition basic_alloc.hpp:61
bool is_free(MemSizeT &size)
Check if block is free using bit 63.
Definition basic_alloc.cpp:35
void * sbrk_then_alloc(MemSizeT size)
Request memory from OS using sbrk and allocate.
Definition basic_alloc.cpp:100
MemSizeT get_size(MemSizeT &size)
Extract actual size by masking off bit 63.
Definition basic_alloc.cpp:62
constexpr MemSizeT MIN_FRAGMENT_SIZE
Minimum fragment size to consider splitting a block.
Definition basic_alloc.hpp:35
void * try_alloc(MemSizeT size)
Allocate memory using first-fit strategy.
Definition basic_alloc.cpp:271
constexpr MemSizeT BLOCK_SIZE
Size of each memory block requested from OS via sbrk.
Definition basic_alloc.hpp:38
void mem_set(void *ptr, int value, size_t num)
Set num bytes to specified value.
Definition basic_alloc.cpp:351
unsigned long long MemSizeT
Type definition for memory size.
Definition basic_alloc.hpp:32
void make_used(MemSizeT &size)
Mark block as used by clearing bit 63.
Definition basic_alloc.cpp:53
void shrink_then_align(MemNode *nd, MemSizeT size)
Shrink a block and create a new free block from remainder.
Definition basic_alloc.cpp:223
void make_free(MemSizeT &size)
Mark block as free by setting bit 63.
Definition basic_alloc.cpp:44
Metadata structure for each memory block.
Definition basic_alloc.hpp:54
MemNode * nxt
Pointer to next block in list.
Definition basic_alloc.hpp:55
MemNode * prv
Pointer to previous block in list.
Definition basic_alloc.hpp:56
MemSizeT size
Size in bytes (bit 0 = free flag)
Definition basic_alloc.hpp:57