如何实现自定义分配器?

unn*_*ddr 4 rust

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

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

  • 它减少了碎片.
  • 它节省了内存.

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

She*_*ter 7

这听起来像你想要的类型竞技场板条箱,它是稳定的,可以在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)
}
Run Code Online (Sandbox Code Playgroud)

这确实有局限性 - 所有对象必须相同.在我的使用中,我有一小部分我希望拥有的类型,所以我刚刚创建了一组Arenas,每种类型一个.

如果这不合适,你可以看一下arena::Arena,它不稳定,比输入的竞技场慢.

两个分配器的基本前提很简单 - 你允许竞技场使用一个项目,它将位移动到它自己的内存分配.

"分配器"一词的另一个含义是在您设置值时使用的含义.计划Rust会在某些时候获得对"placement new"的支持,并且box语法是为此保留的.

在Rust的不稳定版本中,您可以执行类似的操作box Foo(42),并且(假设的)增强功能可以让您说出box my_arena Foo(42)使用指定分配器的内容.这个功能是远离现有的几个版本.