【发布时间】:2012-10-19 19:35:03
【问题描述】:
我有一个非常大(在运行时固定,大约 10 到 3000 万)的数组。每个数组包含 0 到 128 个元素,每个元素为 6 个字节。
我需要将所有数组存储在 mmap 内存中(所以我不能使用 malloc),并且数组需要能够动态增长(最多 128 个元素,并且数组永远不会缩小)。
我实现了一种简单的方法,即使用一个 int 数组来表示 mmap 内存中每个 6 字节块的状态。偏移量处的值 0xffffffff 表示 mmap 内存中的相应偏移量是空闲的,任何其他值都是数组的 id(在我当前的实现中对块进行碎片整理需要它,没有就不能移动块知道他们的数组的 id 来更新其他数据结构)。在分配时,当数组超出其分配时,它会简单地迭代,直到找到足够的空闲块,然后在相应的偏移量处插入。
这是分配数组和映射内存的样子,有点:
| 0xffffffff | 0xfffffff | 1234 | 1234 | 0xffffffff | ...
-----------------------------------------------------------------
| free | free |array1234[0]|array1234[1]| free | ...
这种方法虽然有 offset of furthest used block in mmap'ed memory x 4(4 字节 ber int)的内存开销。
对于这种特定情况有什么更好的方法?
我对此的理想要求是:
- 内存开销(任何分配表 + 未使用空间)
- O(1) 数组的分配和增长
【问题讨论】:
-
您能否确认:您使用的是 Linux 或其他类似 POSIX 的系统?您没有使用 MS Windows?
-
@Robᵩ 是的,最新的 Ubuntu Linux
标签: c++ memory-management malloc