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

高并发内存池|定长内存池的设计

二、定长内存池的设计

设计一个定长的内存池,这个内存池的定长在于,当剩余空间使用完毕后,总是开辟相同长度的新空间来使用。我们会使用到一个指针来切割划分大空间为小空间。大空间是内存池向系统申请的内存大小,而小空间是程序向该内存池申请的内存大小。由于程序向内存池申请存放空间的类型不同,这个小空间的大小也由需要存放的类型决定大小。

FixedPool1

实际上指针只有一个, _freeList 后面的空间理论上是连起来的, _freeList 在被申请空间后更新,相当于链表的头插头删。

#include <iostream>
#include <vector>
#ifdef _WIN32
#include <Windows.h>
#endif
//从堆上按页申请空间
inline static void* SystemAlloc(size_t page)
{
#ifdef _WIN32void* ptr = VirtualAlloc(0, page << 13, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
#endif
#ifdef __linux__size_t size = page << 13;void* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);#endifif (ptr == nullptr){throw std::bad_alloc();}return ptr;
}template<class T>
class FixedPool
{T* New(){T* object = nullptr;//优先使用还回来的空间if (_freeList){void* next = *((void**)_freeList);object = (T*)_freeList;_freeList = next;}//如果大空间不足if (_restBytes < sizeof(T)){_restBytes = 128 * 1024;	//一次申请128Kb的空间_memory = (char*)SystemAlloc(_restBytes >> 13);	//128Kb右移13位相当于16页if (_memory == nullptr){throw std::bad_alloc();}}//从申请的大空间中截一块出来object = (T*)_memory;size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);_memory += objSize;_restBytes -= objSize;//定位new,显示调用T的构造函数new(obj)T;return obj;}void Delete(T* obj){obj->~T();*(void**)obj = _freeList;_freeList = obj;//把空间还回来}
private:char* _memory = nullptr;	//char类型为1字节大小方便申请任意大小的内存size_t _restBytes = 0;	//记录大内存在切分后的剩余比特数void* _freeList = nullptr;
};

*(void**) 的强制类型转换是在兼容 32 位和 64 位,使其不会因为指针大小不同而程序出错,也不用为了兼容 32 位和 64 位使用条件编译。

size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T); 这行,要求开的空间必须比指针大,因为我们会用归还回来的空间存放,_freeList 来指向下一块空间,如果 T 小于指针的大小,就有可能存不进 _freeList

相关文章:

  • CentOS 上配置 Docker 使用 NVIDIA GPU
  • 告别 pip:使用 uv 加速你的 Python 包管理
  • C++ - 仿 RabbitMQ 实现消息队列(2)(Protobuf 和 Muduo 初识)
  • [逆向工程]C++实现DLL注入:原理、实现与防御全解析(二十五)
  • 【Linux】进程间通信(一):认识管道
  • 微软家各种copilot的AI产品:Github copilot、Microsoft copilot
  • Selenium无法定位元素的几种解决方案详解
  • Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?
  • uniapp自动构建pages.json的vite插件
  • 前脚收购 Windsurf 后,OpenAI 深夜发布 Codex。
  • 26、思维链Chain-of-Thought(CoT)论文笔记
  • 9.DMA
  • (9)python开发经验
  • 【机器学习】第二章模型的评估与选择
  • 学习笔记(C++篇)—— Day 6
  • 2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题
  • 数据结构第七章(四)-B树和B+树
  • 从代码学习深度学习 - 词嵌入(word2vec)PyTorch版
  • 兰亭妙微:用系统化思维重构智能座舱 UI 体验
  • HarmonyOS:重构万物互联时代的操作系统范式
  • 雅安市纪委监委回应黄杨钿甜耳环事件:相关政府部门正在处理
  • 上海:到2027年,实现近海航线及重点海域5G网络高质量覆盖
  • 探秘多维魅力,长江经济带、珠三角媒体总编辑岳阳行启动
  • 媒体评欧阳娜娜遭民进党当局威胁:艺人表达国家认同是民族大义
  • 师爷、文士、畸人:会稽范啸风及其著述
  • 国税总局上海市税务局通报:收到王某对刘某某及相关企业涉税问题举报,正依法依规办理