rust - 如何在 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 中不可能(或相当困难)包含对兄弟数据的引用,例如,就像你在这里一样, aVec
和切片Vec
作为相同的字段struct
。根据程序的体系结构,您可以通过将原始代码存储Vec
在代码的某个更高级别(例如,main()
如果您不编写库,它可能存在于堆栈中)和切片引用来解决这个问题。较低级别,编译器可以清楚地推断它不会在之前超出范围(例如,在实例化之后Vec
执行它可以工作)。main()
Vec
推荐阅读
- laravel - Laravel 查询生成器方法 addSelect 不存在
- java - 为什么 hg 克隆从 openjdk url 花费的时间太长
- java - 如何防止 hudi 将分区列写入数据?
- php - 从泰语 ISO-IR-166 到 utf-8 的 php iconv 字符编码不起作用
- linux - 如何删除父文件夹下只有一个文件的子文件夹
- html - iphone 5 在 css 中的标题
- apache-spark - AWS Glue / Spark - AnalysisException 无法在过滤器后解析列名 -> 左连接
- python - 在具有多重导入的 Apache 服务器上运行 python 脚本
- java - Spring Data 递归验证
- c++ - 从命令行拒绝不需要的值