#arena #allocator #immutability #allocation #single #limited #object

不依赖std typed-arena-nomut

快速但受限的分配器类型

1个不稳定版本

使用旧的Rust 2015

0.1.0 2022年4月10日

#327 in 内存管理

Download history 137/week @ 2024-03-13 118/week @ 2024-03-20 195/week @ 2024-03-27 178/week @ 2024-04-03 139/week @ 2024-04-10 241/week @ 2024-04-17 347/week @ 2024-04-24 457/week @ 2024-05-01 338/week @ 2024-05-08 381/week @ 2024-05-15 351/week @ 2024-05-22 300/week @ 2024-05-29 166/week @ 2024-06-05 380/week @ 2024-06-12 230/week @ 2024-06-19 301/week @ 2024-06-26

1,116 每月下载量
用于 wpf-gpu-raster

MIT 许可证

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-arenagenerational-arena

需要逐个释放单个对象?

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

无运行时依赖