Управление жизненным циклом с помощью 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);
}

0 ответов

Другие вопросы по тегам