Похоже, вы хотите, чтобы 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
, что нестабильно и медленнее, чем типичная арена.
Основная предпосылка обоих распределителей проста: вы разрешаете арене потреблять элемент, и он перемещает бит вокруг своего собственного распределения памяти.
Другое значение слова «распределитель» - это то, что используется, когда вы вводите значение. Планируется, что в какой-то момент Rust получит поддержку «размещения новых», и для этого зарезервирован синтаксис box
.
В нестабильных версиях Rust вы можете сделать что-то вроде box Foo(42)
, и (гипотетическое) усовершенствование, которое позволит вам сказать что-то вроде box my_arena Foo(42)
, которое будет использовать указанный распределитель. Эта возможность - это несколько версий от существующих.
Спасибо, это точно то же самое, что я хочу. Что касается синтаксиса «box value», я думаю, что синтаксис был в некоторых старых версиях Rust. Почему он был удален и добавлен снова? –
@unnamed_addr не был удален или добавлен снова^_ ^. Он был отмечен * неустойчивым *, что означает, что он не может использоваться в стабильной версии Rust (например, 1.0 или 1.1.beta), но может использоваться в нестабильных версиях (1.2.dev). Это было отмечено нестабильно только потому, что разработчикам еще предстоит выработать все детали о том, как новое место размещения должно работать, а поддержка его в версии 1.0 означает, что им придется поддерживать его на протяжении всего срока службы Rust 1.x. – Shepmaster
Жаль, что я этого не заметил. В гипотетическом улучшении, которое вы написали, это не «box my_allocator Foo (42)». –