当前位置: 首页 > news >正文

【CPP】固定大小内存池

程序运行时,通常会频繁地进行内存的分配和释放操作。传统的内存分配方式(如使用new和delete运算符)可能会导致内存碎片的产生,并且每次分配和释放内存都有一定的时间开销。内存池通过在程序启动时一次性分配一大块内存或一次性分配多个对象备用,然后在需要时从使用这些内存。当程序使用完内存后,将其归还给内存池,而不是直接释放回操作系统,以此来提高内存分配的效率并减少内存碎片。

#ifndef MEMORY_POOL_HPP_
#define MEMORY_POOL_HPP_#include <condition_variable>
#include <list>
#include <memory>
#include <queue>
#include <type_traits>
#include <utility>#if __cplusplus < 201103L
#error "This program requires C++11 or a later version to compile."
#elif __cplusplus < 201703L
#include <mutex>
#else
#include <shared_mutex>
#endiftemplate <typename ElementType>
class MemoryPool final {template <typename T, typename = void>struct HasReset : std::false_type {};template <typename T>struct HasReset<T, std::void_t<decltype(std::declval<T>().Reset())>> : std::true_type {};static_assert(HasReset<ElementType>::value, "T must has Reset() function");#if __cplusplus < 201703Lusing mutex       = std::mutex;using lock_guard  = std::lock_guard<std::mutex>;using unique_lock = std::lock_guard<std::mutex>;
#elseusing mutex       = std::shared_mutex;using lock_guard  = std::lock_guard<std::shared_mutex>;using unique_lock = std::lock_guard<std::shared_mutex>;
#endifpublic:using SharedPtr = std::shared_ptr<MemoryPool>;using UniquePtr = std::unique_ptr<MemoryPool>;private:explicit MemoryPool(const std::size_t capacity) : capacity(capacity) {}public:MemoryPool(const MemoryPool &)            = delete;MemoryPool(MemoryPool &&)                 = delete;MemoryPool &operator=(const MemoryPool &) = delete;MemoryPool &operator=(MemoryPool &&)      = delete;~MemoryPool() {lock_guard lck(mu);for (auto *item : this->itemAll) {delete item;}this->itemAll.clear();while (!this->itemAvailable.empty()) {this->itemAvailable.pop();}}template <typename... Args>static std::shared_ptr<MemoryPool> Create(std::size_t capacity, Args &&...args) {auto *poolPtr = new MemoryPool(capacity);for (int32_t i = 0; i < poolPtr->capacity; i++) {auto *itemPtr = new ElementType(std::forward<Args>(args)...);poolPtr->itemAll.push_back(itemPtr);poolPtr->itemAvailable.push(itemPtr);}return std::shared_ptr<MemoryPool>(poolPtr);}bool GetSharedPtr(std::shared_ptr<ElementType> &sharedItemPtr, const int32_t timeout = 0) {unique_lock lck(mu);if (timeout > 0) {this->cv.wait_for(lck, std::chrono::milliseconds(timeout), [this] { return !this->itemAvailable.empty(); });} else {this->cv.wait(lck, [this] { return !this->itemAvailable.empty(); });}if (this->itemAvailable.empty()) {sharedItemPtr = nullptr;return false;}auto *itemPtr = this->itemAvailable.front();this->itemAvailable.pop();sharedItemPtr = std::shared_ptr<ElementType>(itemPtr, [this](ElementType *elementPtr) {elementPtr->Reset();this->itemAvailable.push(elementPtr);this->cv.notify_all();});return true;}private:mutex                     mu;std::condition_variable   cv;std::list<ElementType *>  itemAll;std::queue<ElementType *> itemAvailable;std::size_t               capacity;
};
#endif
http://www.xdnf.cn/news/91999.html

相关文章:

  • Java高并发下分布式缓存和数据库一致性解决方案
  • 【文件上传/下载Java+vue3——MQ】
  • [Java · 铢积寸累] 数据结构 — 数组类型 - 增 删 改 查
  • 逻辑回归:使用 S 型函数进行概率预测
  • VMwaer虚拟机复制粘贴、ROS系统安装
  • 武装Burp Suite工具:HaE 分析辅助类_插件.【高亮标记和信息提取利器】
  • C++算法(13):如何高效读取并存储未知数量的空格分隔数字
  • 资本怪兽贝莱德投资数据分析报告-独家
  • 具有相同数量的置位(1位)的下一个更大数字
  • Qt 下载的地址集合
  • 反素数c++
  • 语音合成(TTS)从零搭建一个完整的TTS系统-第二节-中文转拼音
  • 深入解读ConcurrentHashMap特性以及源码
  • 01.Python代码Pandas是什么?pandas的简介
  • EdgeGPT - 新版Bing聊天功能逆向工程
  • pip install pymysql报错
  • Python SQL 工具包:SQLAlchemy介绍
  • oracle将表字段逗号分隔的值进行拆分,并替换值
  • Spark–steaming
  • 【LLM+Code】Claude Code Agent 0.2.9 版本最细致解读
  • Cursor Free VIP 重置进程错误,轻松恢复使用!
  • Element Plus消息通知体系深度解析:从基础到企业级实践
  • SwiftInfer —— 大模型无限流式输入推理打破多轮对话长度限制
  • 序列决策问题(Sequential Decision-Making Problem)
  • 测试开发 - Java 自动化测试核心函数详解
  • 【云馨AI-大模型】Dify 1.2.0:极速集成 SearXNG,畅享智能联网搜索新境界,一键脚本轻松部署SearXNG
  • LeetCode算法题(Go语言实现)_55
  • 麒麟系统使用-系统设置
  • 详解BUG(又名:BUG的生命周期)
  • 从0到1构建企业级消息系统服务体系(终):当消息系统学会「读心术」揭秘情感计算如何让触达转化率飙升 200%