【发布时间】:2021-11-29 08:31:50
【问题描述】:
我正在阅读有关在实时上下文中使用内存池的信息,我想实现文章Making a Pool Allocator 中的代码。我已经陷入了困境:制作一个由固定大小的块组成的循环单链表,它们都位于一个连续的块中。再往下,链表用于跟踪下一个空闲内存块;分配的块从列表中弹出;已释放的块被添加回列表中。
对于固定大小的元素的连续块,我显然考虑了不可变元素的Vector。我可以使用数组索引作为地址,而不是使用可变节点创建循环链表:
struct Chunk{T}
next::Int
data::T
end
function Pool(T, size)
pool = Chunk.(2:size+1, zero(T))
pool[size] = Chunk(1, zero(T))
return pool
end
intpool = Pool(Int, 5)
pool[size] = Chunk(1, zero(T)) 行让我停顿了一下:不可变 Chunks 的一个缺点是,每次我对 data 进行操作时,我都需要访问和编辑 pool,而我不想这样做无论如何都限制为不可变的data。不幸的是,元素通常独立存在并且可以比容器寿命更长,例如return pool[1],因此可变元素与包含的结构或数组分开分配在堆上。但是,在这个用例中,元素只存在于数组中。
这可能是一个长镜头,但有没有办法制作一个可变元素的链表,这些元素分配在一个连续的内存块中?
【问题讨论】:
标签: linked-list julia allocation