3.什么是内存池,如何实现
3.什么是内存池,如何实现
内存池(Memory Pool)*是一种*预先申请一大块内存,在需要时从中分配小块、不用时归还的内存管理方式。
目的:避免频繁 new/malloc 带来的内存碎片、效率低、开销大问题。
核心思想
- 程序启动时一次性向 OS 申请一大块连续内存
- 内部自己管理分配与释放,不频繁向系统申请
- 释放时只是标记 “可用”,不立即还给操作系统
- 最后统一释放整块内存
优点:
- 分配 / 释放极快
- 无内存碎片
- 减少系统调用开销
如何实现(简化思路)
1. 固定大小内存池(最简单常用)
预先把一大块内存切成等大小的块,用链表串起来。
结构:
+--------+--------+--------+--------+
| 块1 | 块2 | 块3 | 块4 |
+--------+--------+--------+--------+
用空闲链表管理:
- 分配:从链表取一个节点
- 释放:把节点还回链表
2. 实现步骤
- 预先开辟一大块内存
- 将内存切分成固定大小的块
- 用链表把所有空闲块串起来
- alloc:从链表头部取一块
- free:将块插回链表
- 最后统一释放整个池
3. 极简伪代码
struct Block {
Block* next;
};
class MemoryPool {
private:
void* mem;
Block* free_list;
public:
MemoryPool(size_t block_size, int count) {
// 1. 申请一大片
mem = malloc(block_size * count);
// 2. 切分成链表
char* ptr = (char*)mem;
for (int i=0; i<count; ++i) {
Block* b = (Block*)ptr;
b->next = free_list;
free_list = b;
ptr += block_size;
}
}
void* alloc() {
if (!free_list) return nullptr;
Block* b = free_list;
free_list = free_list->next;
return b;
}
void free(void* p) {
Block* b = (Block*)p;
b->next = free_list;
free_list = b;
}
~MemoryPool() {
::free(mem);
}
};
一句话总结
内存池是预先申请一大块内存,内部用链表管理小块分配,避免频繁 malloc/free,提升速度并减少碎片。
实现核心:预分配 + 空闲链表管理 alloc/free。

浙公网安备 33010602011771号