#include "memory_pool.h" #include #include // Инициализировать пул памяти void memory_pool_init(struct memory_pool* pool, size_t object_size) { pool->object_size = object_size; pool->free_count = 0; pool->allocations = 0; pool->reuse_count = 0; memset(pool->free_list, 0, sizeof(pool->free_list)); } // Выделить объект из пула или из malloc void* memory_pool_alloc(struct memory_pool* pool) { pool->allocations++; // Если есть свободные объекты в пуле, использовать их if (pool->free_count > 0) { pool->free_count--; pool->reuse_count++; void* obj = pool->free_list[pool->free_count]; pool->free_list[pool->free_count] = NULL; return obj; } // Иначе выделить через malloc return malloc(pool->object_size); } // Освободить объект в пул или в free void memory_pool_free(struct memory_pool* pool, void* obj) { if (!obj) return; // Если пул не заполнен, сохранить объект для повторного использования if (pool->free_count < MEMORY_POOL_SIZE) { pool->free_list[pool->free_count] = obj; pool->free_count++; return; } // Иначе освободить через free free(obj); } // Получить статистику пула void memory_pool_get_stats(struct memory_pool* pool, size_t* allocations, size_t* reuse_count) { if (allocations) *allocations = pool->allocations; if (reuse_count) *reuse_count = pool->reuse_count; } // Очистить пул памяти void memory_pool_destroy(struct memory_pool* pool) { // Освободить все объекты в пуле for (int i = 0; i < pool->free_count; i++) { if (pool->free_list[i]) { free(pool->free_list[i]); pool->free_list[i] = NULL; } } pool->free_count = 0; }