从概念上讲,我们希望创建多个内存池,每个池单独充当堆栈。在每个堆栈中,我们分配不同大小的对象并以类似堆栈的方式释放它们。我们还希望能够以特别的方式从堆栈中分配内存,而不是按顺序迭代地访问每个堆栈。
我们找到了进行堆栈分配和释放的Scratchpad crate 。
问题是分配静态绑定到 的生命周期,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);
}