首页 > 解决方案 > 如何在 Rust 中跨多个结构创建一个连续内存池?

问题描述

我正在尝试在 Rust 中创建一组使用连续内存块的结构。例如:

<------------ Memory Pool -------------->
[  Child  |  Child  |  Child  |  Child  ]

这些结构:

我对 Rust 很陌生,但我精通 C++,所以迄今为止的主要障碍一直是使用所有权语义——我猜有一种简单的方法可以实现这一点(不使用不安全),但解决方案不是我不清楚。我写了一个我正在尝试做的小(破碎)示例:

pub struct Child<'a> {
    pub slice: &'a mut [f32],
}

impl Child<'_> {
    pub fn new<'a>(s: &mut [f32]) -> Child {
        Child {
            slice: s,
        }
    }
}

pub struct Parent<'a> {
    memory_pool: Vec<f32>,
    children: Vec<Child<'a>>,
}

impl Parent<'_> {
    pub fn new<'a>() -> Parent<'a> {
        const SIZE: usize = 100;
        let p = vec![0f32; SIZE];
        let mut p = Parent {
            memory_pool: p,
            children: Vec::new(),
        };
        // Two children using different parts of the memory pool:
        let (lower_pool, upper_pool) = p.memory_pool.split_at_mut(SIZE / 2);
        p.children = vec!{ Child::new(lower_pool), Child::new(upper_pool) };
        return p; // ERROR - p.memory_pool is borrowed 2 lines earlier
    }
}

我更喜欢不涉及不安全的解决方案,但我并不完全反对使用它。非常感谢任何建议,以及在我的示例中我如何(错误?)使用 Rust 的任何更正。

标签: rust

解决方案


是的,目前在 Rust 中不可能(或相当困难)包含对兄弟数据的引用,例如,就像你在这里一样, aVec和切片Vec作为相同的字段struct。根据程序的体系结构,您可以通过将原始代码存储Vec在代码的某个更高级别(例如,main()如果您不编写库,它可能存在于堆栈中)和切片引用来解决这个问题。较低级别,编译器可以清楚地推断它不会在之前超出范围(例如,在实例化之后Vec执行它可以工作)。main()Vec


推荐阅读