c 语言 内存池实现示例
时间: 2023-11-18 14:04:19 浏览: 34
内存池是一种常见的内存管理技术,它可以在程序启动时预先分配一定数量的内存空间,并将其划分为多个固定大小的块,然后在程序运行过程中动态地将这些块分配给需要使用内存的对象,从而减少内存碎片和内存分配的时间开销。下面是一个简单的内存池实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BLOCK_SIZE 1024
#define BLOCK_NUM 10
typedef struct _memory_block {
void *start;
void *end;
struct _memory_block *next;
} memory_block;
typedef struct _memory_pool {
size_t block_size;
memory_block *free_list;
memory_block *used_list;
} memory_pool;
memory_pool *memory_pool_create(size_t block_size) {
memory_pool *pool = (memory_pool *) malloc(sizeof(memory_pool));
pool->block_size = block_size;
pool->free_list = NULL;
pool->used_list = NULL;
for (int i = 0; i < BLOCK_NUM; i++) {
memory_block *block = (memory_block *) malloc(sizeof(memory_block));
block->start = malloc(block_size);
block->end = (char *) block->start + block_size;
block->next = pool->free_list;
pool->free_list = block;
}
return pool;
}
void *memory_pool_alloc(memory_pool *pool, size_t size) {
memory_block *block = pool->free_list;
while (block) {
if ((char *) block->end - (char *) block->start >= size) {
void *ptr = block->start;
block->start = (char *) block->start + size;
if (block->start == block->end) {
pool->free_list = block->next;
block->next = pool->used_list;
pool->used_list = block;
}
return ptr;
}
block = block->next;
}
return NULL;
}
void memory_pool_free(memory_pool *pool) {
memory_block *block = pool->used_list;
while (block) {
memory_block *next = block->next;
free(block->start);
free(block);
block = next;
}
block = pool->free_list;
while (block) {
memory_block *next = block->next;
free(block->start);
free(block);
block = next;
}
free(pool);
}
int main() {
memory_pool *pool = memory_pool_create(BLOCK_SIZE);
char *str1 = (char *) memory_pool_alloc(pool, 10);
char *str2 = (char *) memory_pool_alloc(pool, 20);
char *str3 = (char *) memory_pool_alloc(pool, 30);
strcpy(str1, "hello");
strcpy(str2, "world");
strcpy(str3, "memory pool");
printf("%s %s %s\n", str1, str2, str3);
memory_pool_free(pool);
return 0;
}
```
该示例中,首先定义了两个结构体:memory_block表示内存块,包括起始地址、结束地址和下一个内存块的指针;memory_pool表示内存池,包括块大小、空闲链表和已用链表。
然后,定义了三个函数:memory_pool_create用于创建内存池,先分配一定数量的内存块,并将其加入空闲链表;memory_pool_alloc用于从内存池中分配一块指定大小的内存空间,遍历空闲链表,找到第一个大小足够的内存块,并将其划分为新的内存空间;memory_pool_free用于释放内存池中的所有内存块,将已用链表和空闲链表中的内存块全部释放。
最后,在main函数中创建一个内存池,并使用memory_pool_alloc从内存池中分配三个字符串空间,将其赋值并打印出来,最后使用memory_pool_free释放内存池中的所有内存块。