Управление жизненным циклом с помощью Scratchpad Crate с использованием Rust
Концептуально мы стремимся создать несколько пулов памяти, каждый из которых по отдельности выступает в качестве стека. Внутри каждого стека мы размещаем объекты разных размеров и освобождаем их стековым способом. Мы также хотим иметь возможность выделять память из стеков специальным образом, а не итеративно посещать каждый стек по порядку.
Мы нашли ящик Scratchpad, который выполняет выделение и освобождение стека.
Проблема в том, что распределение статически связано с временем жизни Marker
и Marker
статически связан с временем жизни Scratchpad
, Хотя мы не хотим, чтобы выделения переживали соответствующую выделенную память, проверка срока службы затрудняет (или, возможно, делает невозможным?) Помещение блокнота, маркеров и выделений в один объект.
В показанном простом примере это можно обойти, включив Scratchpad по ссылке, но я не уверен, что это можно обобщить для случая использования, который нам нужен, когда несколько маркеров и распределений хранятся вместе.
Вот пример кода, который не компилируется:
extern crate scratchpad;
use scratchpad::{MarkerFront, Scratchpad};
#[derive(Debug)]
struct Stuff<'sp: 'a, 'a> {
scratchpad: Scratchpad<&'sp mut [u8], &'sp mut [usize]>,
marker: Option<MarkerFront<'a, &'sp mut [u8], &'sp mut [usize]>>,
}
fn main() {
let pool0: &mut [u8] = &mut [0; 1024];
let pool1: &mut [usize] = &mut [0; 64];
let sp = Scratchpad::new(pool0, pool1);
let mut stuff = Stuff {
scratchpad: sp,
marker: None,
};
stuff.marker = Some(stuff.scratchpad.mark_front().unwrap());
println!("{:?}", stuff);
stuff.marker = None;
println!("{:?}", stuff);
}
error[E0597]: `stuff.scratchpad` does not live long enough
--> src/main.rs:19:25
|
19 | stuff.marker = Some(stuff.scratchpad.mark_front().unwrap());
| ^^^^^^^^^^^^^^^^ borrowed value does not live long enough
...
23 | }
| - `stuff.scratchpad` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
Пример кода, который компилируется:
extern crate scratchpad;
use scratchpad::{MarkerFront, Scratchpad};
#[derive(Debug)]
struct Stuff<'sp: 'a, 'a> {
// This is now a reference
scratchpad: &'sp Scratchpad<&'sp mut [u8], &'sp mut [usize]>,
marker: Option<MarkerFront<'a, &'sp mut [u8], &'sp mut [usize]>>,
}
fn main() {
let pool0: &mut [u8] = &mut [0; 1024];
let pool1: &mut [usize] = &mut [0; 64];
let sp = Scratchpad::new(pool0, pool1);
let mut stuff = Stuff {
scratchpad: &sp,
marker: None,
};
stuff.marker = Some(stuff.scratchpad.mark_front().unwrap());
println!("{:?}", stuff);
stuff.marker = None;
println!("{:?}", stuff);
}