1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2022年4月10日 |
---|
#327 in 内存管理
1,116 每月下载量
用于 wpf-gpu-raster
37KB
570 行
typed-arena-nomut
这是typed-arena分配器的分支,它返回不可变引用而不是可变引用。这允许在借用期间迭代分配器项。
单个类型值的快速(但受限)分配器。
分配的对象在分配器本身被销毁时一次性销毁。在分配器仍然存活时不会释放单个对象。另一方面,分配速度快:通常只是一个向量推送。
还有一个名为 into_vec()
的方法,可以在不需要分配器时恢复分配对象的拥有权,而不是销毁一切。
示例
use typed_arena_nomut::Arena;
struct Monster {
level: u32,
}
let monsters = Arena::new();
let goku = monsters.alloc(Monster { level: 9001 });
assert!(goku.level > 9000);
安全循环
所有分配的对象都具有相同的生命周期,因此可以在它们之间安全地创建循环。这可以用于某些数据结构,例如具有父指针的图和树。
use std::cell::Cell;
use typed_arena_nomut::Arena;
struct CycleParticipant<'a> {
other: Cell<Option<&'a CycleParticipant<'a>>>,
}
let arena = Arena::new();
let a = arena.alloc(CycleParticipant { other: Cell::new(None) });
let b = arena.alloc(CycleParticipant { other: Cell::new(None) });
a.other.set(Some(b));
b.other.set(Some(a));
替代方案
需要分配许多不同类型的值吗?
如果有几种不同的类型,请使用多个分配器,或者尝试使用 bumpalo
,它是一种跳增分配器,可以分配异构类型的值。
希望分配返回标识符而不是引用,并在所有地方处理引用和生命周期?
请查看 id-arena
或 generational-arena
。
需要逐个释放单个对象?
请查看 generational-arena
以获取类似分配器的crate,或者寻找更传统的分配器。