当前位置: 首页 > 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.wxhsa.cn/company.asp?id=6762

相关文章:

  • C++ 内存管理
  • 浅谈制氢电源及英飞凌解决方案
  • 微算法科技(NASDAQ:MLGO)研究分布式量子计算,释放量子计算潜能
  • AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢
  • Flash Attention原理
  • MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案
  • opencv学习记录1
  • kylin V10SP3安装mysql5.7.42
  • MATLAB 仿真无线传感器网络(WSN)三大经典场景
  • 9.05 DP 专题
  • Linux时间同步---NTP时间同步方案
  • java预习
  • B/S体系结构风格
  • The 2024 CCPC Online Contest 7/12 L/B/K/D/J/E/C
  • 在joule里面使用agent 功能
  • Feign动态URL配置
  • 自动化部署工具 Jenkins 的安装与配置
  • pip 搭建源
  • qoj10093 Jump the Frog
  • new 和make
  • Ceres 常用 LossFunction 对比
  • python函数
  • git使用
  • 测试开发全日制学徒班火热报名中|跟着名企大咖做真实项目,结业即上岗
  • 墨刀是否能替代Axure?从产品经理三大画图能力深度分析
  • AI 自动化智能体训练营
  • 微信商户绑定微信公众号、小程序
  • 唯创知音AI语音交互芯片与模组介绍
  • k3s 高可用集群部署(内置 etcd + VIP + keepalived)
  • 问HashMap底层原理?