超级好用的C++实用库之环形内存池

💡 需要该C++实用库源码的大佬们,可搜索微信公众号"希望睿智"。添加关注后,输入消息"超级好用的C++实用库",即可获得源码的下载链接。

概述

环形内存池是一种高效的内存管理技术,特别适合于高并发、实时性要求高的系统中,比如:网络服务器、游戏引擎、实时音视频等领域。它的设计基于环形缓冲区的概念,通过循环利用内存空间来减少内存碎片和分配效率问题。环形内存池一次性申请大块内存,并切分为固定大小的内存块,避免了频繁的系统级内存请求,降低了系统调用开销。

CHP_FifoMemPool

为了方便环形内存池的使用,我们封装了CHP_FifoMemPool类。CHP_FifoMemPool是先分配先释放的环形内存池,适用于内存池的总大小相对固定的场景。一般会结合队列使用,应用层需保证先分配的内存先释放。使用CHP_FifoMemPool时,默认会加锁,以确保多线程环境下的资源安全。如果应用层需要对CHP_FifoMemPool和相关的队列一起加锁,则CHP_FifoMemPool初始化时可以不用加锁。

CHP_FifoMemPool类的头文件,可参考下面的示例代码。

cpp 复制代码
#pragma once

#include <map>

#include "HP_Mutex.h"

class CHP_FifoMemPool
{
public:
        CHP_FifoMemPool();
        ~CHP_FifoMemPool();

        int Init(unsigned int uiTotalBytes, bool bNeedLock = true);

        char *Alloc(unsigned int uiBytes);

        void Release(char *pBuf);
        
        void Reset();

private:
        typedef std::map<char *, unsigned int> MemToLenMap;

        unsigned int m_uiTotalBytes;
        bool m_bNeedLock;
        char *m_pMemStart;
        char *m_pMemEnd;
        char *m_pFreeStart;
        char *m_pFreeEnd;
        char *m_pReleaseEnd;
        char *m_pRemainStart;
        CHP_Mutex m_mutexMem;
        MemToLenMap m_mapMemToLen;
};

下面,我们逐个介绍CHP_FifoMemPool类导出的公共接口。

Init:初始化内存池。参数uiTotalBytes为内存池的最大字节数,参数bNeedLock表示是否需要加锁,默认加锁。返回值为0表示成功,其他为错误码。

Alloc:分配指定大小的buffer。参数uiBytes为buffer的大小,单位为字节。返回非NULL表示成功,否则失败。

Release:释放buffer。参数pBuf为之前分配的的buffer指针。

Reset:重置内存池,需要确保应用层不再使用已分配的buffer。

总结

环形内存池的设计有效提高了内存分配和回收的效率,特别适合于那些内存分配模式可预测、频繁分配和释放小块内存的场景。在高性能网络、实时系统、游戏引擎等领域,环形内存池展现出显著优势,通过减少内存管理开销和提高内存使用效率,为应用带来更高的响应速度和吞吐量。

相关推荐
liu****2 小时前
20.传输层协议TCP
服务器·网络·数据结构·c++·网络协议·tcp/ip·udp
沐怡旸2 小时前
【穿越Effective C++】条款20:宁以pass-by-reference-to-const替换pass-by-value——参数传递的效率与语义
c++·面试
八个程序员2 小时前
c++音乐——《两只老虎》
c++·游戏
..空空的人3 小时前
C++基于websocket的多用户网页五子棋 ---- 模块介绍1
开发语言·c++·websocket
叫我龙翔3 小时前
【数据结构】从零开始认识B树 --- 高效外查找的数据结构
数据结构·c++·b树
zzzsde4 小时前
【C++】红黑树:使用及实现
开发语言·c++·算法
点云SLAM4 小时前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
码界奇点4 小时前
Linux进程间通信三System V 共享内存完全指南原理系统调用与 C 封装实现
linux·c语言·网络·c++·ux·risc-v
小无名呀4 小时前
tcp_Calculator(自定义协议,序列化,反序列化)
网络·c++·网络协议·tcp
AA陈超4 小时前
ASC学习笔记0001:处理目标选择系统中当Actor拒绝目标确认时的调用
c++·笔记·学习·游戏·ue5·游戏引擎·虚幻