1 个不稳定版本
0.1.0 | 2024年6月9日 |
---|
#302 在 内存管理
17KB
309 行
有序池分配器
一个具有O(1)块访问、分配和释放以及O(nlog(n))块排序的快速紧凑型池分配器
本项目是一个学习练习,旨在探索内存池的工作原理以及如何针对小型头文件大小和特定操作(如排序内存块)进行优化
设计
物理块索引与虚拟块索引的比较
为了确保在排序后现有的已分配块指针仍然指向各自的块,我们需要对块索引进行排序而不是对块本身进行排序。这意味着我们需要定义两种类型的索引:物理和虚拟。
物理块索引用于在内存中定位物理块,是固定的。虚拟块索引代表分配器中块的当前虚拟顺序。这些索引不应该被存储,因为它们在排序或块释放后可能会指向不同的物理块。假设块永远不会被释放或排序,虚拟和物理块索引将始终保持同步。
头部
为了实现块分配和释放的最快时间复杂度,我们除了物理块外还需要存储三样东西
- 当前分配的虚拟块索引到物理块索引的映射(
physical_block_indices
)。这允许分配器在执行块索引时找到正确的物理块。 - 当前分配的物理块索引到虚拟块索引的映射(
virtual_block_indices
)。这允许分配器在块释放时以O(1)时间找到要更新的虚拟块索引。 - 先前已释放的物理块索引的堆栈。这允许分配器在块分配时以O(1)时间找到现有的已释放块。