内存池(Memory Pool)

内存池(Memory Pool)

内存池(Memory Pool)是一种内存管理技术,主要用于优化程序中动态内存分配和释放的效率,减少内存碎片,提高程序运行速度。以下是内存池的一些关键概念和工作原理介绍;

一、基本概念

内存池预先从操作系统申请一大块连续内存空间,并将其管理起来,当程序需要分配内存时,不再直接向操作系统请求,而是从内存池中快速分配一小块事先准备好的内存单元。当不再需要这些内存时,也不是直接归还给操作系统,而是归还给内存池,由内存池统一管理,适时或在程序结束时再归还给操作系统。

二、工作原理

预分配: 程序启动或初始化阶段,一次性向系统申请大量内存,形成内存池。
分割管理: 内存池中的内存会被分割成多个大小相等或不等的块(固定大小或可变大小内存池)。
分配: 当程序请求内存时,内存池快速分配一个合适的内存块给请求方,这个过程往往通过链表、位图等数据结构高效实现。
回收: 释放内存时,不是直接还给系统,而是归还给内存池,可能需要进行合并相邻空闲块的操作以减少碎片。
重用: 回收的内存块可以被后续的分配请求重用,减少了频繁的系统调用,提高了效率。

三、优缺点点
优点
  • 提高效率: 减少了系统调用的次数,内存分配和释放更快。
  • 减少碎片: 通过管理内存分配策略,可以有效减少内存碎片问题。
  • 可控性: 程序员可以更好地控制内存的使用,有利于内存泄漏的检测和防止。
  • 性能提升: 对于频繁分配和释放小块内存的场景尤其有效,如游戏、数据库、服务器等高性能应用。
缺点
  • 内存占用: 初始时预分配的内存可能会造成一定的内存浪费。
  • 实现复杂: 内存池的设计和实现相对复杂,需要考虑多种因素,如内存分配策略、内存碎片整理等。
  • 调试困难: 错误的内存管理可能会导致难以追踪的bug。
四、简单实现
  • 实现每次固定申请内存块的大小,每次内存可申请和释放
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MEM_POOL_SIZE 4096
typedef struct mempool_s {
   
    int block_size;    // 每个内存块的大小
    int free_count;    // 空闲内存块的数量
    char* free_ptr;     // 指向第一个空闲内存块的指针
    char* mem_ptr;      // 指向第一个内存块的指针
} mempool_t;

int mempool_init(mempool_t* pool, int block_size)
{
   
    // 初始化内存池
    if (pool == NULL)
        return -1;

    if (block_size <= 16) 
        block_size = 16;

    pool->block_size = block_size;
    pool->mem_ptr = (char*)malloc(MEM_POOL_SIZE);
    if (pool->mem_ptr == NULL)
        return -1;
    pool->free_ptr = pool->mem_ptr;
    pool->free_count = MEM_POOL_SIZE / block_size;


    // 初始化内存池中的内存块
    char* ptr = pool->free_ptr;
    for (int i = 0; i < pool->free_count; i++)
    {
   
    	//将当前内存块的首地址处存储下一个内存块的地址,通过 (char**)ptr 强制类型转换,
    	//将 ptr 转为指向 char* 类型的指针的指针,然后将 ptr + block_size 的值存入,形成一个单向链表结构。
        *(char**)ptr = ptr + block_size;     // 下一个内存块的指针
        ptr += block_size;                   // 移动当前内存块的指针 ptr 到下一个内存块的起始位置,即加上 block_size
    }
    *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值