如何实现自定义分配器?

时间:2015-05-19 12:58:10

标签: rust

我正在寻找一种方法来实现Rust中的内存池。

我想在块中分配一组相关的小对象,并一次删除对象集。对象不会单独释放。这种方法有几个好处:

  • 减少碎片。
  • 节省内存。

有没有办法在Rust中创建这样的分配器?

3 个答案:

答案 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)

有趣的是,您想要的分配器已在arena包中提供。它不稳定,所以你必须使用nightlies来使用这个箱子。如果您想知道它是如何实现的,可以查看它的sources

答案 2 :(得分:2)

您可能需要查看标准库中的arena::TypedArena注意:这不稳定,因此仅在夜间版本中可用)。

如果这不符合您的需求,您可以随时查看源代码(您可以点击文档右上角的[src]链接),看看它是如何完成的。