C语言实现一个内存池
时间: 2023-11-24 19:17:35 浏览: 93
内存池是一种常用的内存分配方式,可以避免频繁的内存申请和释放,提高内存使用效率。下面是一个简单的C语言实现内存池的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#define BLOCK_SIZE 4096 // 每个内存块的大小
#define MIN_ALLOC 16 // 最小分配单位
#define MAX_ALLOC 1024 // 最大分配单位
// 内存块结构体
typedef struct _memory_block {
struct _memory_block *next; // 下一个内存块
char *data; // 数据区域
size_t used; // 已使用的大小
size_t size; // 总大小
} memory_block;
// 内存池结构体
typedef struct _memory_pool {
memory_block *first; // 第一个内存块
memory_block *last; // 最后一个内存块
} memory_pool;
// 初始化内存块
memory_block *memory_block_init(size_t size) {
memory_block *block = (memory_block *)malloc(sizeof(memory_block));
block->next = NULL;
block->data = (char *)malloc(size);
block->used = 0;
block->size = size;
return block;
}
// 销毁内存块
void memory_block_destroy(memory_block *block) {
free(block->data);
free(block);
}
// 初始化内存池
void memory_pool_init(memory_pool *pool) {
pool->first = NULL;
pool->last = NULL;
}
// 销毁内存池
void memory_pool_destroy(memory_pool *pool) {
memory_block *block = pool->first;
while (block) {
memory_block *temp = block;
block = block->next;
memory_block_destroy(temp);
}
}
// 从内存池中分配内存
void *memory_pool_alloc(memory_pool *pool, size_t size) {
// 对齐内存大小
size = (size + MIN_ALLOC - 1) / MIN_ALLOC * MIN_ALLOC;
// 遍历内存块列表
memory_block *block = pool->first;
while (block) {
// 查找可用内存
if (block->size - block->used >= size) {
void *data = block->data + block->used;
block->used += size;
return data;
}
block = block->next;
}
// 没有可用内存,创建新的内存块
size_t block_size = size > BLOCK_SIZE ? size : BLOCK_SIZE;
memory_block *new_block = memory_block_init(block_size);
if (!pool->first) {
pool->first = new_block;
} else {
pool->last->next = new_block;
}
pool->last = new_block;
// 分配内存
void *data = new_block->data;
new_block->used = size;
return data;
}
// 从内存池中释放内存(不做实际操作)
void memory_pool_free(memory_pool *pool, void *data) {
// 不做实际
阅读全文