#arena #allocation #allocator #limited #single #object #typed

no-std typed-arena

快速(但有限)的分配区域类型

14个稳定版本

使用旧的Rust 2015

2.0.2 2023年1月9日
2.0.1 2020年1月10日
2.0.0 2019年12月3日
2.0.0-rc12019年11月26日
1.0.1 2015年4月10日

#10内存管理

Download history 167249/week @ 2024-04-05 182115/week @ 2024-04-12 171716/week @ 2024-04-19 143270/week @ 2024-04-26 145496/week @ 2024-05-03 156622/week @ 2024-05-10 167584/week @ 2024-05-17 150796/week @ 2024-05-24 146811/week @ 2024-05-31 157370/week @ 2024-06-07 159155/week @ 2024-06-14 151405/week @ 2024-06-21 146107/week @ 2024-06-28 159410/week @ 2024-07-05 163935/week @ 2024-07-12 130000/week @ 2024-07-19

622,715 每月下载量
用于 1,059 个crate(95个直接使用)

MIT 许可证

37KB
572

typed-arena

Github Actions Build Status

单个类型值的快速(但有限)分配区域。

分配的对象将在区域本身被销毁时一次性销毁。在区域本身仍然存活时,不会释放单个对象。另一方面,分配速度很快:通常只是向向量中推送。

还有一个方法 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-arenagenerational-arena

需要一次释放单个对象?

请查看 generational-arena 以获取类似区域的crate或寻找更传统的分配器。

无运行时依赖