3.什么是内存池,如何实现

3.什么是内存池,如何实现

内存池(Memory Pool)*是一种*预先申请一大块内存,在需要时从中分配小块、不用时归还的内存管理方式。

目的:避免频繁 new/malloc 带来的内存碎片、效率低、开销大问题。

核心思想

  1. 程序启动时一次性向 OS 申请一大块连续内存
  2. 内部自己管理分配与释放,不频繁向系统申请
  3. 释放时只是标记 “可用”,不立即还给操作系统
  4. 最后统一释放整块内存

优点:

  • 分配 / 释放极快
  • 无内存碎片
  • 减少系统调用开销

如何实现(简化思路)

1. 固定大小内存池(最简单常用)

预先把一大块内存切成等大小的块,用链表串起来。

结构:

+--------+--------+--------+--------+
| 块1    | 块2    | 块3    | 块4    |
+--------+--------+--------+--------+

空闲链表管理:

  • 分配:从链表取一个节点
  • 释放:把节点还回链表

2. 实现步骤

  1. 预先开辟一大块内存
  2. 将内存切分成固定大小的块
  3. 用链表把所有空闲块串起来
  4. alloc:从链表头部取一块
  5. free:将块插回链表
  6. 最后统一释放整个池

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。

posted @ 2023-08-02 21:47  CodeMagicianT  阅读(194)  评论(0)    收藏  举报