2015-05-19 4 views
4

Я ищу способ реализовать что-то вроде пула памяти в Rust.Как реализовать пользовательский распределитель?

Я хочу выделить набор связанных небольших объектов в кусках и удалить сразу множество объектов. Объекты не будут освобождаться отдельно. Существует несколько преимуществ такого подхода:

  • Уменьшает фрагментацию.
  • Это экономит память.

Есть ли способ создать распределитель, подобный этому, в Rust?

ответ

7

Похоже, вы хотите, чтобы 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), которое будет использовать указанный распределитель. Эта возможность - это несколько версий от существующих.

+0

Спасибо, это точно то же самое, что я хочу. Что касается синтаксиса «box value», я думаю, что синтаксис был в некоторых старых версиях Rust. Почему он был удален и добавлен снова? –

+0

@unnamed_addr не был удален или добавлен снова^_ ^. Он был отмечен * неустойчивым *, что означает, что он не может использоваться в стабильной версии Rust (например, 1.0 или 1.1.beta), но может использоваться в нестабильных версиях (1.2.dev). Это было отмечено нестабильно только потому, что разработчикам еще предстоит выработать все детали о том, как новое место размещения должно работать, а поддержка его в версии 1.0 означает, что им придется поддерживать его на протяжении всего срока службы Rust 1.x. – Shepmaster

+0

Жаль, что я этого не заметил. В гипотетическом улучшении, которое вы написали, это не «box my_allocator Foo (42)». –

2

Забавная штука, распределитель, который вы хотите, уже доступен в ящике . Это неустойчиво, поэтому вам нужно использовать ночные рубашки, чтобы использовать этот ящик. Вы можете посмотреть его sources, если хотите знать, как он реализован.

2

В стандартной библиотеке вы можете посмотреть arena::TypedArena (Примечание: это нестабильно и, как результат, доступно только в ночных сборках).

Если это не соответствует вашим потребностям, вы всегда можете проверить исходный код (вы можете нажать ссылку [src] в правом верхнем углу документации), чтобы узнать, как это делается.

+0

Внутренняя версия нестабильна, но внешняя на crates.io, которая является той, которую вы должны использовать, есть. –

Смежные вопросы