#ifndef _LIBC_STDLIB__MEM_ #define _LIBC_STDLIB__MEM_ #include struct mem_node { // сколько свободно size_t free; // Размер блока size_t size; struct mem_node* last; struct mem_node* next; // реально выделена под него память // если нет, то он получается был втиснут в другой блок // bool is_real; }; // блок выделенной памяти struct mem_block { size_t size; // сколько было полученно памяти }; // получить указатель на данные ноды #define GET_MEM_NODE_PTR(node) (char*)((char*)(node) + sizeof(struct mem_node)) // Является ли блок сейчас пустым #define MEM_NODE_IS_FREE(node) (node->free == node->size) #define GET_mem_node_USED_MEM(node) (node->size - node->free) #define GET_mem_node_HEADER(ptr) ((struct mem_node*)((char*)ptr - sizeof(struct mem_node))) // проверить находятся ли ноды в одном блоке. // Если они в одном блоке, но получаестя они должны идти друг за другом #define mem_nodeS_ARE_IN_ONE_BLOCK(left, right) (GET_MEM_NODE_PTR(left) + left->size == (char*)right) // Размер блока #define ALLOC_BLOCK_SIZE 4096 inline size_t __mem_align(size_t value, size_t v) { size_t ret = (value + v - 1) & ~(v - 1); return ret; } static struct mem_node* __mem_node = NULL; #endif // _LIBC_STDLIB_MEM_