如何实现自定义分配器?

How to implement a custom allocator?

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

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

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

有趣的是,如果您想知道它是如何实现的,arena crate. It is unstable, so you have to use nightlies to use this crate. You can look at its sources 中已经提供了您想要的分配器。

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

如果这不符合您的需要,您可以随时检查源代码(您可以单击文档右上角的 [src] link)以了解它是如何完成的。

听起来你想要 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,每种类型一个。

如果那不合适,你可以看看 arena::Arena,它不稳定并且比类型化的竞技场慢。

这两个分配器的基本前提都很简单 - 您允许 arena 消耗一个项目,然后它将位移动到它自己的内存分配。

"allocator" 一词的另一个含义是当您将值装箱时使用的含义。计划 Rust 将在某个时候获得对 "placement new" 的支持,并为此保留 box 语法。

在 Rust 的不稳定版本中,您可以执行类似 box Foo(42) 的操作,并且对此的(假设的)增强将允许您说类似 box my_arena Foo(42) 的操作,这将使用指定的分配器。此功能似乎与现有功能相差几个版本。