我正在寻找一种方法来实现Rust中的内存池。
我想在块中分配一组相关的小对象,并一次删除对象集。对象不会单独释放。这种方法有几个好处:
有没有办法在Rust中创建这样的分配器?
答案 0 :(得分:7)
听起来你想要typed arena crate,它是稳定的,可以在Rust 1.0中使用。
extern crate typed_arena;
#[derive(Debug)]
struct Foo {
a: u8,
b: u8,
}
fn main() {
let allocator = typed_arena::Arena::new();
let f = allocator.alloc(Foo { a: 42, b: 101 });
println!("{:?}", f)
}
这确实有局限性 - 所有对象必须相同。在我的使用中,我有一小部分我希望拥有的类型,所以我刚刚创建了一组Arena
s,每种类型一个。
如果这不合适,你可以查看arena::Arena
,它不稳定且比输入的竞技场慢。
两个分配器的基本前提很简单 - 你允许竞技场使用一个项目并将它们移动到它自己的内存分配。
单词" allocator"的另一个含义是盒装值时使用的内容。计划Rust将获得对#34; place new"在某些时候,box
语法是为此保留的。
在Rust的不稳定版本中,您可以执行box Foo(42)
之类的操作,以及(假设的)增强功能,这样您就可以使用box my_arena Foo(42)
来表示使用指定分配器的内容。这种能力远比现有的几个版本。
答案 1 :(得分:2)
答案 2 :(得分:2)
您可能需要查看标准库中的arena::TypedArena
(注意:这不稳定,因此仅在夜间版本中可用)。
如果这不符合您的需求,您可以随时查看源代码(您可以点击文档右上角的[src]
链接),看看它是如何完成的。