14个稳定版本
使用旧的Rust 2015
2.0.2 | 2023年1月9日 |
---|---|
2.0.1 | 2020年1月10日 |
2.0.0 | 2019年12月3日 |
2.0.0-rc1 | 2019年11月26日 |
1.0.1 | 2015年4月10日 |
#10 在 内存管理 中
622,715 每月下载量
用于 1,059 个crate(95个直接使用)
37KB
572 行
typed-arena
单个类型值的快速(但有限)分配区域。
分配的对象将在区域本身被销毁时一次性销毁。在区域本身仍然存活时,不会释放单个对象。另一方面,分配速度很快:通常只是向向量中推送。
还有一个方法 into_vec()
用于在区域不再需要时恢复分配对象的所有权,而不是销毁一切。
示例
use typed_arena::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::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
,这是一个可以分配异构类型值的bump-allocation区域。
希望分配返回标识符而不是引用,并在每个地方处理引用和生命周期?
请查看 id-arena
或 generational-arena
。
需要一次释放单个对象?
请查看 generational-arena
以获取类似区域的crate或寻找更传统的分配器。