超级好用的C++实用库之动态内存池

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

概述

动态内存池是一种内存管理技术,主要用于提高程序在频繁进行小块内存分配和释放时的效率。相比于传统的malloc/free、new/delete、或其他动态内存分配函数,内存池预先申请一大块连续内存,并将这块大内存分割成多个固定大小或一定范围大小的小内存块,然后以池的方式管理和分发这些小内存块。

内存池一般包括:初始化、分配内存块、回收内存块以及整体释放等功能模块。具体实现时,可以通过数组、链表或树等多种数据结构来组织和追踪空闲内存块的状态。当请求分配内存时,从池中取出一个空闲块。当内存不再使用时,将其归还到内存池中,以便后续复用。

CHP_DynamicMemPool类

在C++中,并没有内置的内存池类。为了方便应用层使用内存池,我们封装了CHP_DynamicMemPool类。CHP_DynamicMemPool类是对动态内存池的封装,适用于需要频繁使用内存块,内存块的总数相对固定,但每个内存块的大小不一样的场景,一般会结合队列使用。CHP_DynamicMemPool类的头文件,可参考下面的示例代码。

#pragma once

#include <list>

#include "HP_Mutex.h"

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

    void Init(unsigned int uiMaxBlockCount, bool bNeedLock = true);

    char *Alloc(unsigned int uiBytes);

    void Release(char *pBuf);

    void Reset();

    unsigned int GetTotalBlockCount();

    void GetCurBlockCount(unsigned int &uiUsedCount, unsigned int &uiFreeCount);

private:
    typedef struct _TDynamicMemBlock 
    {
        char *pBlock;
        unsigned int uiBlockLen;
    }TDynamicMemBlock;

    typedef std::list<TDynamicMemBlock> TDynamicMemBlockList;

    unsigned int m_uiMaxBlockCount;
    bool m_bNeedLock;
    TDynamicMemBlockList m_listUsed;
    TDynamicMemBlockList m_listFree;
    CHP_Mutex m_mutexBlockList;
};

CHP_DynamicMemPool类有6个公共成员函数,下面逐一进行介绍。

Init:初始化内存池,内存池中含有多个内存块,每个内存块的大小可能不一样。参数uiMaxBlockCount为内存块的最大个数,分配内存时,如果超过内存块的最大个数,则分配失败;参数bNeedLock表示是否需要加锁,默认值为true,如果应用层使用CHP_DynamicMemPool对象时已经加了锁,这里可以传入false。

Alloc:分配指定大小的buffer。内存池中含有一个已使用队列和一个空闲队列,分配buffer时,先从空闲队列中查找是否有符合条件的内存块。如果有,直接返回该内存块;如果没有,则检查所有内存块的数量是否超过内存块的最大个数。如果没有超过,则新建一个合适大小的内存块,并加入已使用队列中。如果超过,且空闲队列非空,则从空闲队列取一个内存块,并重新分配合适大小的内存。参数uiBytes为buffer的大小,单位为字节。返回非NULL表示成功,否则失败。

Release:释放buffer,将其从已使用队列放入到空闲队列中。参数pBuf为之前分配的的buffer指针。

Reset:重置内存池,会释放所有内存块中的内存。

GetTotalBlockCount:获取所有内存块的数量。

GetCurBlockCount:获取已使用内存块和空闲内存块的数量。参数uiUsedCount为已使用内存块的数量,参数uiFreeCount为空闲内存块的数量。


相关文章
|
15天前
|
并行计算 C++ Windows
|
3月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
128 26
|
8月前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
4月前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
60 1
|
12月前
|
算法 C++ 容器
C++标准库(速查)总结
C++标准库(速查)总结
263 6
|
10月前
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
404 68
|
7月前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
9月前
|
JSON C++ 数据格式
C++20 高性能基础库--兰亭集库助力开发者构建高性能应用
这次分享的主题是《高性能基础库--兰亭集库助力开发者构建高性能应用》的实践经验。主要分为三个部分: 1. 业务背景 2. 雅兰亭库架构 3. 业务优化
216 9
|
9月前
|
XML 网络协议 API
超级好用的C++实用库之服务包装类
通过本文对Boost.Asio、gRPC和Poco三个超级好用的C++服务包装类库的详细介绍,开发者可以根据自己的需求选择合适的库来简化开发工作,提高代码的效率和可维护性。每个库都有其独特的优势和适用场景,合理使用这些库可以极大地提升C++开发的生产力。
194 11
|
8月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
345 0

热门文章

最新文章