2个不稳定版本
0.2.0 | 2023年1月23日 |
---|---|
0.1.0 | 2022年11月8日 |
#601 in 内存管理
每月 1,008 次下载
6KB
67 行
BumpSlab:具有可重用插槽的bump分配器
Bumpslab是一个提供集合内部项目稳定引用的slab。
通常,当一个vec增长时,它的项目将会移动。Bumpslab是一个提供指针而不是键的场分配器。这允许你在不需要使用值的场的情况下跟踪指针的内容。这意味着指针在Slot<>
的生命周期内保证稳定。
示例
struct MyThing(usize);
let slab = BumpSlab::new();
let a = slab.push(MyThing(0));
let b = slab.push(MyThing(1));
let c = slab.push(MyThing(2));
let last = slab.push(MyThing(3));
let ptr = last.ptr();
slab.remove(last);
let new_last = slab.push(Mything(4));
let new_ptr = new_last.ptr();
// Slots get reused, known by pointer
assert_eq!(ptr, new_ptr);
何时使用BumpSlab
- 你需要稳定的引用(例如,在没有Arc的情况下驱动futures)
- 你只有一种类型
- 迭代对你来说不如查找重要
作为Arc的替代方案使用
此crate的主要动机是允许在不要求为自定义waker代码使用Arc的情况下生成futures批处理。唤醒者需要一个稳定的引用,通常由Arc保证。然而,如果你生成许多futures,这可能会带来一些分配开销。BumpSlab为你提供了唤醒者生命周期的稳定引用,并在它们被释放时重用插槽,与Arc相比保持了更高的缓存局部性。
依赖关系
~240KB