本文共 1661 字,大约阅读时间需要 5 分钟。
Loki::Allocator 是由 C++ 编委会成员开发的一款内存分配器,其代码版本为 0.1.7,虽然从未正式发布,但其设计思路和实现方法值得学习。相比于标准的 std::alloc,Loki::Allocator 具有独特的内存管理方式,能够有效地进行内存回收和分配操作。
Loki::Allocator 可以划分为三个嵌套结构:从底到顶分别为 Chunk、FixedAllocator 和 SmallObjAllocator。这些结构共同协同,负责内存的分配与管理。
在实际应用中,Loki::Allocator 通常用于管理大块不带 cookie 的内存分配。其操作过程可以通过以下示意图理解:
Chunk -> FixedAllocator -> SmallObjAllocator
如上图所示,Chunk 是内存管理的基本单元,FixedAllocator 负责对大块内存的分配管理,而 SmallObjAllocator 则负责小块内存的分配。
Chunk 是内存管理的最小单元,其主要实现包括以下几个关键函数:
Chunk::Allocate():
firstAvailableBlock 的序号和 pData 的位置计算分配内存的起始地址。blocksAvailableBlock_ 的存量。Chunk::Deallocate():
firstAvailableBlock_ 更新为 p 的序号。blocksAvailableBlock_ 的存量。FixedAllocator 负责对大块内存的分配与释放。其核心逻辑包括以下步骤:
Allocate():
Deallocate():
VicinityFind(p) 函数,定位需要释放的内存块所在的 Chunk。Chunk::Deallocate(p) 进行内存回收。Chunk::Release() 将内存归还给操作系统。VicinityFind(p):
deallocChunk 向上和向下暴搜,找到 p 所在的 Chunk。deallocChunk 是否为当前 Chunk。p 不在当前 Chunk 内,则导致死循环(这是一个已知 bug)。DoDeallocate():
Chunk::Deallocate(p)。Chunk::Release() 将内存归还给操作系统。尽管 Loki::Allocator 从未正式发布,但其设计思路和实现方法仍具有参考价值:
优点:
缺点:
VicinityFind 和 DoDeallocate 中的死循环问题。与 std::alloc 对比:
std::alloc 则有限制。总的来说,Loki::Allocator 在内存管理方面展现出了一种独特的思路,值得在内存管理领域进一步研究和探索。
转载地址:http://qcbb.baihongyu.com/