网易首页 > 网易号 > 正文 申请入驻

C++实现简单的内存池

0
分享至

内存池(Memory Pool)是计算机编程中一种重要的内存管理技术,它预先分配一块较大的内存区域,并将其划分为多个大小相等的内存块。这种技术旨在减少因频繁申请和释放小块内存而引发的性能开销。下面,我们将结合代码,一步步讲解如何实现一个简单的内存池,并分析其工作原理。



一、内存池的基本概念

内存池是一种用于动态内存分配的技术,其核心思想是空间换时间。通过预先分配一大块内存,并将其划分为多个小块,内存池能够快速地为程序提供所需的内存,而无需每次都向操作系统申请。这样可以大大减少内存分配和释放的开销,提高程序的运行效率。

二、内存池的实现步骤1. 定义内存池类

首先,我们定义一个名为AdvancedMemoryPool的模板类,它接受一个类型参数T和一个默认大小为100的整数参数PoolSize。这个类将用于管理内存池的分配和回收。

template class AdvancedMemoryPool {    // ...};
2. 初始化内存池

在类的构造函数中,我们调用expandPool函数来初始化内存池。这个函数将分配一块大小为PoolSize * sizeof(T)的内存,并将其划分为PoolSize个大小为sizeof(T)的内存块。这些内存块的地址被添加到freeChunks_列表中,表示它们是空闲的,可以被分配。

AdvancedMemoryPool() {    expandPool();}private:void expandPool() {    char* newBlock = new char[sizeof(T) * PoolSize];    for (size_t i = 0; i < PoolSize; ++i) {        freeChunks_.push_back(reinterpret_cast(newBlock + i * sizeof(T)));    }    pool_.push_back(newBlock);}
3. 分配内存块

alloc函数用于从内存池中分配一个空闲的内存块。它首先检查freeChunks_列表是否为空。如果为空,则调用expandPool函数来扩展内存池。然后,它从freeChunks_列表中取出一个空闲的内存块,并将其从列表中移除。最后,返回这个内存块的地址。

T* alloc() {    std::lock_guard lock(mutex_); // 确保线程安全    if (freeChunks_.empty()) {        expandPool();    }    T* ptr = freeChunks_.front();    freeChunks_.pop_front();    return ptr;}

这里使用了std::lock_guard来确保在多线程环境下的线程安全。当多个线程同时尝试分配内存时,std::mutex会确保同一时间只有一个线程能够访问内存池。

4. 回收内存块

dealloc函数用于回收一个之前分配的内存块。它接受一个指向要回收的内存块的指针,并将这个指针添加到freeChunks_列表中,表示这个内存块现在是空闲的,可以被再次分配。

void dealloc(T* ptr) {    assert(ptr != nullptr); // 确保传入的指针不为空    std::lock_guard lock(mutex_); // 确保线程安全    freeChunks_.push_back(ptr);}

同样,这里也使用了std::lock_guard来确保线程安全。

5. 查询内存池状态

我们还提供了两个函数getFreeChunksCount和getUsedChunksCount来查询内存池的状态。这两个函数分别返回空闲和已使用的内存块数量。

size_t getFreeChunksCount() const {    std::lock_guard lock(mutex_); // 确保线程安全    return freeChunks_.size();}size_t getUsedChunksCount() const {    return PoolSize - getFreeChunksCount();}
三、使用内存池

在主函数中,我们创建了一个AdvancedMemoryPool对象,并使用它来分配和回收内存块。通过调用alloc函数,我们可以从内存池中获取一个空闲的内存块,并使用它来存储数据。当我们不再需要这个内存块时,可以调用dealloc函数将其回收回内存池。

四、完整代码

#include   #include   #include   #include   #include     template   class AdvancedMemoryPool {  public:      AdvancedMemoryPool() {          expandPool();      }        ~AdvancedMemoryPool() {          std::lock_guard lock(mutex_);          for (auto& chunk : pool_) {              delete[] reinterpret_cast(chunk);          }      }        T* alloc() {          std::lock_guard lock(mutex_);          if (freeChunks_.empty()) {              expandPool();          }            T* ptr = freeChunks_.front();          freeChunks_.pop_front();          return ptr;      }        void dealloc(T* ptr) {          assert(ptr != nullptr);          std::lock_guard lock(mutex_);          freeChunks_.push_back(ptr);      }        size_t getFreeChunksCount() const {          std::lock_guard lock(mutex_);          return freeChunks_.size();      }        size_t getUsedChunksCount() const {          return PoolSize - getFreeChunksCount();      }    private:      void expandPool() {          char* newBlock = new char[sizeof(T) * PoolSize];          for (size_t i = 0; i < PoolSize; ++i) {              freeChunks_.push_back(reinterpret_cast(newBlock + i * sizeof(T)));          }          pool_.push_back(newBlock);      }        mutable std::mutex mutex_;      std::list freeChunks_;      std::list pool_;  };    // 使用示例  struct ComplexObject {      int data[100];      // 假设这是一个复杂的对象,需要动态分配  };    int main() {      AdvancedMemoryPool pool;        ComplexObject* obj1 = pool.alloc();      ComplexObject* obj2 = pool.alloc();        std::cout << "Free chunks: " << pool.getFreeChunksCount() << std::endl;      std::cout << "Used chunks: " << pool.getUsedChunksCount() << std::endl;        pool.dealloc(obj1);      pool.dealloc(obj2);        std::cout << "Free chunks after deallocation: " << pool.getFreeChunksCount() << std::endl;      std::cout << "Used chunks after deallocation: " << pool.getUsedChunksCount() << std::endl;        return 0;  }

#头条创作挑战赛#​

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
1946年,林徽因和金岳霖在昆明别墅同住5个月,梁思成:我不担心

1946年,林徽因和金岳霖在昆明别墅同住5个月,梁思成:我不担心

百年历史老号
2024-06-07 07:35:07
甘肃“首虎”落马,网友:名声极坏早该查了!

甘肃“首虎”落马,网友:名声极坏早该查了!

梦马笔谈
2024-06-12 20:17:52
记者:建议足协不要只盯着归化,向余望可破格提拔到国家队考察

记者:建议足协不要只盯着归化,向余望可破格提拔到国家队考察

直播吧
2024-06-12 12:39:04
人大附中张雨欣火了!“局里局气”引热议,母亲身份不一般

人大附中张雨欣火了!“局里局气”引热议,母亲身份不一般

牛锅巴小钒
2024-06-13 01:54:26
离谱!撕裂+肌腱脱臼,刚复出就趴窝,6000万先生真是脆到家了

离谱!撕裂+肌腱脱臼,刚复出就趴窝,6000万先生真是脆到家了

球童无忌
2024-06-12 11:27:18
事发上海五星级酒店!母女泡澡时,房门突然开了…值班经理却说:流程没问题

事发上海五星级酒店!母女泡澡时,房门突然开了…值班经理却说:流程没问题

上观新闻
2024-06-12 14:53:32
没增程就打不过比亚迪,但降价到20万的特斯拉能赢华为?

没增程就打不过比亚迪,但降价到20万的特斯拉能赢华为?

路咖汽车
2024-06-10 17:38:09
50岁贝嫂维多利亚宣布放弃节食:人生太短,没空去数卡路里!

50岁贝嫂维多利亚宣布放弃节食:人生太短,没空去数卡路里!

听风听你
2024-06-13 00:07:53
小姑子女儿高考结束,她把住3年的房还我,收房子打开鞋柜,愣了

小姑子女儿高考结束,她把住3年的房还我,收房子打开鞋柜,愣了

爱情大使馆
2024-06-12 10:44:25
传华东政法毕业生就业难!校友会发出倡议渡难关,张雪峰失算了?

传华东政法毕业生就业难!校友会发出倡议渡难关,张雪峰失算了?

火山诗话
2024-06-13 09:12:39
解放军中将在京突然去世,两女儿定居美国,亲弟弟关联25家公司

解放军中将在京突然去世,两女儿定居美国,亲弟弟关联25家公司

求实者
2024-06-12 14:30:22
怎么分都是死亡之组!18强赛参赛队确定,国足落位第五档

怎么分都是死亡之组!18强赛参赛队确定,国足落位第五档

齐鲁壹点
2024-06-12 10:36:25
Here we go!罗马诺:赫罗纳队长阿莱克斯-加西亚加盟勒沃库森

Here we go!罗马诺:赫罗纳队长阿莱克斯-加西亚加盟勒沃库森

直播吧
2024-06-13 03:45:06
拜纳姆堕落真因?终于真相大白,前队友揭露真相,还他清白

拜纳姆堕落真因?终于真相大白,前队友揭露真相,还他清白

阿雄侃篮球
2024-06-12 14:04:16
比亚迪秦 L 极限工况测试:1182.2km!首个“千里俱乐部”会员

比亚迪秦 L 极限工况测试:1182.2km!首个“千里俱乐部”会员

科技Nice
2024-06-12 15:13:34
国家终于不再原谅王濛,77枚金牌不是万能,而自大只会被抛弃

国家终于不再原谅王濛,77枚金牌不是万能,而自大只会被抛弃

兰子记
2024-06-11 18:28:00
黄岩岛附近中方战舰全撤走,美韩近百架战机闯入,055的机会来了

黄岩岛附近中方战舰全撤走,美韩近百架战机闯入,055的机会来了

小lu侃侃而谈
2024-06-09 22:47:52
女模特私密视频意外泄露遭疯狂传播,本人崩溃痛哭,恳求不要观看

女模特私密视频意外泄露遭疯狂传播,本人崩溃痛哭,恳求不要观看

吃鱼思故渊
2024-05-17 22:00:37
性感港星庆生超60位艺人到贺!造型夸张,大晒导弹身材

性感港星庆生超60位艺人到贺!造型夸张,大晒导弹身材

我爱追港剧
2024-06-11 12:15:24
韩国名宿:亚洲八支球队比中国队强,其中一支让在场的人哈哈大笑

韩国名宿:亚洲八支球队比中国队强,其中一支让在场的人哈哈大笑

开心体育站
2024-06-13 00:24:18
2024-06-13 10:30:44
鲨鱼编程
鲨鱼编程
懂点技术,懂点编程
441文章数 155关注度
往期回顾 全部

科技要闻

欧盟“下手”,比亚迪等多家中国车企中招

头条要闻

牛弹琴:阿根廷人正在愤怒 指责米莱将国家带入深渊

头条要闻

牛弹琴:阿根廷人正在愤怒 指责米莱将国家带入深渊

体育要闻

国足,别辜负这场奇迹!

娱乐要闻

黄一鸣再次录视频表态孩子是王思聪的

财经要闻

徽商银行的影子 借基金向地方城投放贷?

汽车要闻

理想汽车周销量突破1万辆 单周销量首超宝马奥迪

态度原创

时尚
亲子
教育
游戏
公开课

夏季这样穿“半身裙”,你就是整条街最靓的仔

亲子要闻

提起来那一刻,小脑萎缩了

教育要闻

THE发布2024世界大学影响力排名!牛剑哈佛竟都没上榜?

《AC:影》不强迫玩家用黑人武士 一直用女忍没问题

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版