#fixed-size #arena #constant-time #latency #depend #typed-arena

no-std fixed-typed-arena

使用固定大小的块来确保非摊销的O(1)分配的类型化竞技场

8个版本

0.3.3 2023年9月18日
0.3.2 2022年12月20日
0.3.0 2022年11月11日
0.2.3 2022年11月11日
0.1.0 2021年2月7日

#105 in 内存管理

每月44次下载

GPL-3.0-or-later

65KB
1K SLoC

fixed-typed-arena

使用可配置的固定大小内存块分配单个类型值的竞技场(类似于typed-arena),这使得它能够在非摊销的O(1)(常数)时间内进行分配。

其他竞技场实现,如typed-arena,针对吞吐量进行了优化:它们以指数增长的大小分配内存块,从而实现摊销常数时间分配。

fixed-typed-arena针对延迟进行了优化:它以固定、可配置的大小分配内存块,单个值分配在非摊销常数时间内完成。

此crate仅依赖于corealloc,因此可以在支持allocno_std环境中使用。

示例

use fixed_typed_arena::Arena;
struct Item(u64);

let arena = Arena::<_, 128>::new();
let item1 = arena.alloc(Item(1));
let item2 = arena.alloc(Item(2));
item1.0 += item2.0;

assert_eq!(item1.0, 3);
assert_eq!(item2.0, 2);

参考文献

Arena分配的项目可以包含与竞技场本身相同生命周期的引用,包括对其他项目的引用,但必须启用crate功能dropck_eyepatch。这需要Rust nightly,因为fixed-typed-arena必须使用同名的非稳定语言功能

或者,您可能可以使用ManuallyDropArena

ManuallyDropArena

此crate还提供了类似于ManuallyDropArenaArena,但它返回任何生命周期的引用,包括'static。这种类型的优点是可以不借用来使用,但代价是如果不调用不安全的drop方法,将会泄露内存。

迭代

fixed-typed-arena的arenatype允许遍历所有已分配的项。对于Arena提供了安全的可变迭代,如果Options::Mutable为false,则所有arenatype提供安全的不可变迭代。无论选项如何,所有arenatype都提供不安全的可变和不可变迭代。

依赖关系