# memap **Repository Path**: hujiyo/memap ## Basic Information - **Project Name**: memap - **Description**: 数组地图————掌管固定大小数组的内存分配和释放,追求高性能,在特定项目中很有用处 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-11 - **Last Updated**: 2025-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # memap 微型内存池 #### gitee网站太不稳定,主平台移至github --2025.5.27 ## 项目简介 `memap` 是一个高效的内存池管理库,专为频繁分配和释放小块内存的场景设计。它通过位图管理内存块,极大减少了系统 `malloc/free` 的调用次数,从而提升性能并降低内存碎片化风险。适用于嵌入式开发、缓存池、对象池、队列/链表等需要高性能内存管理的应用。 本项目由 `strmap` 项目重命名而来,原有代码已迁移至 `src/old/` 目录作为历史版本保留。 ## 设计理念 - **高效分配与释放**:采用位图算法,查找和标记空闲块速度快,适合高频操作。 - **灵活扩容**:当内存池空间不足时可自动扩容,适应动态需求。 - **安全性**:所有操作基于偏移量,避免直接暴露裸指针。 - **对齐优化**:强制块大小和块数量为32的倍数,保证4字节对齐,提升访问效率。 - **兼容性**:提供 C 和 C++ 两种接口,便于集成到不同项目。 ## 目录结构 - `src/memap.c`/`memap.h`:C语言实现的内存池接口与实现。 - `src/memap.hpp`:C++风格的内存池类实现。 - `src/old/`:历史版本(strmap)相关代码,仅供参考。 ## 主要接口(C) ```c struct MEMAP { uint8_t* strpool; }; int memap_init(struct MEMAP* m, uint32_t block_size, uint32_t block_num); void memap_free(struct MEMAP* m); OFFSET memap_smalloc(struct MEMAP* m, uint32_t len); void memap_sfree(struct MEMAP* m, OFFSET offset, uint32_t len); int memap_iserr(struct MEMAP* m); int memap_iserr_offset(struct MEMAP* m, OFFSET offset); uint8_t* memap_addr(struct MEMAP* m, OFFSET offset); ``` ## 使用示例 ```c #include "memap.h" int main() { struct MEMAP m; memap_init(&m, 64, 1280); // 初始化内存池,块大小64字节,共1280块 OFFSET off = memap_smalloc(&m, 128); // 分配128字节 if (off != NULL_OFFSET) { uint8_t* ptr = memap_addr(&m, off); // 使用ptr strcpy((char*)ptr, "hello memap!"); printf("%s\n", ptr); memap_sfree(&m, off, 128); // 释放 } memap_free(&m); // 释放整个内存池 return 0; } ``` ## 性能建议 - 建议 `block_size` 选择为常用分配对象的大小或其倍数,减少空间浪费。 - 初始 `block_num` 设为实际需求的上限,避免频繁扩容。 - 内存池适合管理大量生命周期短、大小一致或相近的小对象。 - 自动扩容会有一次性分配和数据迁移的开销,建议在初始化时预留足够空间。 ## 注意事项 - `block_size` 和 `block_num` 必须为32的倍数,否则自动使用默认值。 - 返回的偏移量需通过 `memap_addr` 转换为指针后使用。 - 释放时需传入与分配时一致的长度。 - 内存池可自动扩容,但建议合理预估初始容量以提升性能。 - 本库不负责多线程同步,如需多线程环境请自行加锁。 @hj18914255909@outlook.com