如何实现自定义分配器?
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)
的操作,这将使用指定的分配器。此功能似乎与现有功能相差几个版本。
我正在寻找一种在 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)
的操作,这将使用指定的分配器。此功能似乎与现有功能相差几个版本。