Rust 如何实现自定义分配器?

Rust 如何实现自定义分配器?,rust,Rust,我正在寻找一种实现类似Rust中的内存池的方法 我想在块中分配一组相关的小对象,并立即删除该组对象。对象不会单独释放。这种方法有几个好处: 它减少了碎片 它可以节省内存 有没有办法在Rust中创建这样的分配器?有趣的是,您想要的分配器已经在板条箱中可用了。它不稳定,所以你必须在夜间使用这个板条箱。如果您想知道它是如何实现的,您可以查看它。您可能想在标准库中查看它(注意:这是不稳定的,因此只能在夜间版本中使用) 如果这不符合您的需要,您可以随时检查源代码(您可以单击文档右上角的[src]链接)

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

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

  • 它减少了碎片
  • 它可以节省内存

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

有趣的是,您想要的分配器已经在板条箱中可用了。它不稳定,所以你必须在夜间使用这个板条箱。如果您想知道它是如何实现的,您可以查看它。

您可能想在标准库中查看它(注意:这是不稳定的,因此只能在夜间版本中使用)


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

听起来您想要的是稳定的,可以在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,每种类型一个

如果这不合适,你可以看看,这是不稳定的,比一个类型化的竞技场慢

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

“分配器”一词的另一个含义是当您将一个值放入框中时所使用的内容。据计划,Rust将在某个时候获得对“placement new”的支持,而
语法将为此保留


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

谢谢,这正是我想要的。关于
框值
语法,我认为该语法出现在一些旧版本的Rust中。为什么它被删除并再次添加?@unnamed\u addr它没有被删除或再次添加^。它被标记为不稳定,这意味着它不能用于稳定版本的Rust(如1.0或1.1.beta),但可以用于不稳定版本(1.2.dev)。它之所以被标记为不稳定,纯粹是因为开发人员还没有敲定有关placement new应该如何工作的所有细节,并且在1.0中支持它意味着他们必须在Rust 1.x的整个生命周期中支持它。抱歉,我没有注意到它。在您编写的假设增强中,
box my\u allocator Foo(42)
@unnamed\u addr我认为这是
box
语法不稳定的部分原因。例如,
box
关键字是否应始终返回
box
类型?您可能对和感兴趣。@unnamed_addr不用担心-您没有弄错,只是语言的这一部分还没有完全充实。我们两个都不是对的,也不是错的,因为还没有“对”字!内部版本不稳定,但crates.io上的外部版本(您应该使用的版本)不稳定。