/** * @file rt_alloc.h * @brief 内存分配器接口 * * 提供三种内存分配器实现:简单分配器、固定大小分配器和长块分配器 */ #ifndef __SMCC_RT_ALLOC_H__ #define __SMCC_RT_ALLOC_H__ #include "std/rt_api_def.h" /** @defgroup simple_allocator 简单分配器 */ /** * @brief 分配指定大小的内存块 * @param size 请求分配的内存大小(字节) * @return 成功返回内存指针,失败返回NULL */ void* salloc_alloc(int size); /** * @brief 重新分配内存块 * @param ptr 原内存指针 * @param size 新内存大小(字节) * @return 成功返回新内存指针,失败返回NULL */ void* salloc_realloc(void* ptr, int size); /** * @brief 释放内存块 * @param ptr 要释放的内存指针 */ void salloc_free(void* ptr); /** @defgroup fixed_allocator 固定大小分配器 */ /** * @struct fixed_alloc_t * @brief 固定大小内存分配器上下文 */ typedef struct fixed_alloc { /** @brief 内存页链表头指针 */ void* page_list; /** @brief 空闲块链表头指针 */ void* free_list; /** @brief 每个内存块的固定大小 */ int block_size; /** @brief 每页包含的块数量 */ int blocks_per_page; } fixed_alloc_t; /** * @brief 初始化固定大小分配器 * @param fa 分配器上下文指针 * @param fixed_size 每个内存块的固定大小 * @param init_size 初始预分配块数量 */ void falloc_init(fixed_alloc_t* fa, int fixed_size, int init_size); /** * @brief 分配固定大小内存块 * @param fa 分配器上下文指针 * @return 成功返回内存指针,失败返回NULL */ void* falloc_alloc(fixed_alloc_t* fa); /** * @brief 释放内存块 * @param fa 分配器上下文指针 * @param ptr 要释放的内存指针 */ void falloc_free(fixed_alloc_t* fa, void* ptr); /** * @brief 销毁分配器并释放所有内存页 * @param fa 分配器上下文指针 */ void falloc_destroy(fixed_alloc_t* fa); /** @defgroup long_allocator 长块分配器 */ /** * @struct long_block_t * @brief 长块内存块头结构 */ typedef struct long_block { /** @brief 指向下一个内存块的指针 */ struct long_block* next; /** @brief 当前块使用状态标志 */ int used; } long_block_t; /** * @struct long_alloc_t * @brief 长块分配器上下文 */ typedef struct long_alloc { /** @brief 当前内存块指针 */ long_block_t* current; /** @brief 内存块的标准大小 */ int block_size; } long_alloc_t; /** * @brief 初始化长块分配器 * @param la 分配器上下文指针 */ void lalloc_init(long_alloc_t* la); /** * @brief 分配指定大小的内存块 * @param la 分配器上下文指针 * @param size 请求分配的内存大小 * @return 成功返回内存指针,失败返回NULL */ void* lalloc_alloc(long_alloc_t* la, int size); /** * @brief 标记释放内存块(实际在块耗尽时统一释放) * @param la 分配器上下文指针 * @param ptr 要释放的内存指针 */ void lalloc_free(long_alloc_t* la, void* ptr); /** * @brief 销毁分配器并释放所有内存块 * @param la 分配器上下文指针 */ void lalloc_destroy(long_alloc_t* la); #endif // __SMCC_RT_ALLOC_H__