1 个不稳定版本

0.1.0 2019 年 7 月 2 日

⚠️ 已报告问题

#20#数据结构


用于 garbo

GPL-3.0 许可证

15KB
155

Bunch

一个只增的并发区域。

保证

推入区域的所有元素都不会移动或修改。所有元素都会在区域被删除时一次性删除。

由于元素在内存中不移动,因此可以安全地由多个线程并发访问。

只有在向结构中推送时才需要锁定,以确保不同线程中的分配逻辑不会相互干扰。

缺点

元素分配在堆上的多个切片中,因此不支持范围前缀。尽管如此,迭代器可能被支持。

内存布局

切片在内存中的排列模式如下

[T, T] [T, T, T, T] [T, T, T, T, T, T, T, T]

每次新分配的大小是前一次的两倍。

为了有效地从索引计算行和列,我们可以使用一个特殊的指令 usize::leading_zeros(),它有点像对数2运算。

fn lane_offset(offset: usize) -> (usize, usize) {
    let i = offset / 2 + 1;
    let lane = USIZE_BITS - i.leading_zeros() as usize - 1;
    let offset = offset - (2usize.pow(lane as u32) - 1) * 2;
    (lane, offset)
}

依赖项

~1MB
~18K SLoC