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

Alexandresku设计的loki小对象内存分配器

Loki是由 Alexandresku 编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。其中有两个文件 SmallObj.h 、SmallObj.cpp 进行内存管理,可以单独进行使用

image

 


三个class,第一层是chunk,第二层是vector<chunk> FixedAllocator,第三层是vector<vector<chunk>> SmallObjallocator。第一层的chunk负责实际内存的管理,一个chunk管理一个unsigned char[blockSize * blocks]数组,第二层的vector<chunk>管理相同大小区块的内存,第三层vector<vector<chunk>>管理不同大小区块所有的内存。
chunk中含有 指向区块的指针pData & firstAvailableBlock 下一个分配区块索引值 & blocksAvailable 未分配区块数量。借用区块数组中的第一个byte做索引值(类似于嵌入式指针),初始化流水号标识索引,通过索引值组织成单向链表。firstAvailableBlock链表头索引,分配的时候,取出链表头索引对应的区块,然后更新链表头索引;释放一个区块的时候,先计算出释放的区块对应的索引值,然后更新链表头索引,类似头插法。判断是否还能分配或者全回收看blocksAvailable值。
FixedAllocator 中有指向分配和释放的两根指针(标出最近有分配动作的chunk,标出最近有释放动作的chunk)和 vector<chunk>。分配时候首先查看最近有分配动作的chunk是否还有空闲区块,如果没有就for遍历,找到就分配,找不到就再push_back一个chunk到该vector<chunk>中,交给下一层做分配动作。释放先找到释放的区块是在哪一个chunk中,然后交给下一层做释放区块动作。
SmallObjallocator 层管理不同大小区块所有的内存,每一个vector<chunk> 负责不同大小区块的管理。
特点:精简强悍,使用索引实现链表,有缓式回收设计。使用容器作为设计基础,设计出来的分配器也为容器服务,两者不相干扰。

参考:

https://segmentfault.com/a/1190000040206098

https://sourceforge.net/projects/loki-lib/files/Loki/

https://www.cnblogs.com/wuyun--wy/p/17650083.html

http://www.rkmt.cn/news/6795.html

相关文章:

  • java预习
  • B/S体系结构风格
  • Feign动态URL配置
  • 自动化部署工具 Jenkins 的安装与配置
  • Ceres 常用 LossFunction 对比
  • git使用
  • 测试开发全日制学徒班火热报名中|跟着名企大咖做真实项目,结业即上岗
  • AI 自动化智能体训练营
  • 微信商户绑定微信公众号、小程序
  • iphone运行windows系统
  • 图片结构 - voasem
  • 实用指南:25年高联:一试填空题解析(下篇)
  • Spring AOP 面向切面编程 - 浪矢
  • 天下拍拍卖系统:二方系统也能扩展三方平台功能
  • day07 课程
  • .net core 发布到 iis 步骤
  • kylin SP2安装mysql8.4.5
  • 详细介绍:PHP基础-语法初步(第七天)
  • maven项目连接DM数据库和基本sql使用
  • Inventor Professional 2026.1.1 产品设计与工程制图
  • 叮当计步微信小程序系统
  • fetch-event-source踩坑sse(getReader)后续 IOS全量返回问题
  • 手机上有哪些比较好用的待办事项提醒工具 - 指南
  • 事半功倍是蠢蛋53 tornado接口报错
  • kylin SP2安装mysql 8.0.41
  • SAP采购订单数据获取
  • 能源管理的数字神经:MyEMS如何重塑能效认知
  • ​​普科科技罗氏线圈应用指南:精准掌控电流测量的艺术​​
  • .NET驾驭Word之力:玩转文本与格式
  • 泰克CT-6交流电流探头测量原理