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

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

概述

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

CHP_FifoMemPool

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

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

#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。

总结

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

相关文章
|
2月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
79 6
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
112 10
|
2月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
52 3
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
88 4
|
2月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
153 21
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
79 5
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
72 1