#generational-arena #generational #arena #arena-allocator #slab #constant-time

无需std thunderdome

具有紧凑代际索引的快速代际分配器

12个版本

0.6.1 2023年6月25日
0.6.0 2022年10月18日
0.5.1 2022年7月4日
0.5.0 2021年10月7日
0.4.0 2020年11月17日

#40内存管理

Download history 1192/week @ 2024-03-14 1824/week @ 2024-03-21 1969/week @ 2024-03-28 1435/week @ 2024-04-04 2089/week @ 2024-04-11 1768/week @ 2024-04-18 1998/week @ 2024-04-25 1562/week @ 2024-05-02 1407/week @ 2024-05-09 1568/week @ 2024-05-16 1647/week @ 2024-05-23 1577/week @ 2024-05-30 1301/week @ 2024-06-06 1461/week @ 2024-06-13 2337/week @ 2024-06-20 1305/week @ 2024-06-27

6,660 每月下载量
用于 118 个crates (直接使用18个)

MIT/Apache

57KB
1K SLoC

Thunderdome

GitHub CI Status thunderdome on crates.io thunderdome docs

Thunderdome是一个受generational-arenaslotmapslab 启发的代际竞技场。它通过从Arena返回的小(8字节)键提供恒定时间的插入、查找和删除。

Thunderdome的关键类型,Index,当放入Rust的NonZero*类型中时,仍然是8字节,这是由于Rust的NonZero*类型。

基本示例

let mut arena = Arena::new();

let foo = arena.insert("Foo");
let bar = arena.insert("Bar");

assert_eq!(arena[foo], "Foo");
assert_eq!(arena[bar], "Bar");

arena[bar] = "Replaced";
assert_eq!(arena[bar], "Replaced");

let foo_value = arena.remove(foo);
assert_eq!(foo_value, Some("Foo"));

// The slot previously used by foo will be reused for baz
let baz = arena.insert("Baz");
assert_eq!(arena[baz], "Baz");

// foo is no longer a valid key
assert_eq!(arena.get(foo), None);

与类似Crates的比较

功能 Thunderdome generational-arena slotmap slab
代际索引¹
size_of::<索引>() 8 16 8 8
size_of::<Option<索引>>() 8 24 8 16
最大元素数 2³² 2⁶⁴ 2³² 2⁶⁴
Copy
no_std支持
Serde支持
  1. 代际索引有助于解决ABA问题,这可能导致悬挂的键错误地访问新插入的数据。

最低支持的Rust版本(MSRV)

Thunderdome支持Rust 1.47.0及更高版本。在Thunderdome达到1.0之前,MSRV的变化将需要主要版本升级。在1.0之后,MSRV的变化将仅需要次要版本升级,但需要充分的理由。

Crates功能

  • std(默认):使用标准库。禁用以使此crates与no-std兼容。

许可证

许可如下

由您选择。

贡献

除非您明确说明,否则任何根据Apache-2.0许可证定义的、您有意提交以包含在作品中的贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

无运行时依赖

功能