// memory_pool.h #ifndef MEMORY_POOL_H #define MEMORY_POOL_H #include #include "debug_config.h" #define MEMORY_POOL_MAX_FREE 64 #define XSTR(s) STR(s) #define STR(s) #s #define PLOCATION __FILE__ ":" XSTR(__LINE__) "[POOL]" struct memory_pool { void* free_head; // Голова linked list свободных блоков (next хранится в начале каждого блока) int free_count; // Количество свободных блоков size_t object_size; // Размер объектов в пуле size_t allocations; // Общее количество аллокаций (включая новые malloc) size_t reuse_count; // Количество повторных использований из пула }; // сам пул: // если используем с элементами ll_queue то не забываем что к object_size надо прибавить sizeof(struct ll_entry) struct memory_pool* memory_pool_init(size_t object_size); void memory_pool_destroy(struct memory_pool* pool); // элементы пула: void* memory_pool_alloc_impl(struct memory_pool* pool, const char* location); void memory_pool_free_impl(struct memory_pool* pool, void* obj, const char* location); void memory_pool_get_stats(struct memory_pool* pool, size_t* allocations, size_t* reuse_count); size_t memory_pool_get_total_free_blocks(void); #define memory_pool_alloc(pool) memory_pool_alloc_impl(pool, PLOCATION) #define memory_pool_free(pool, obj) memory_pool_free_impl(pool, obj, PLOCATION) #endif // MEMORY_POOL_H