gpt4 book ai didi

rust - 是否可以对非重叠内存进行安全的可变别名?

转载 作者:行者123 更新时间:2023-11-29 08:10:57 29 4
gpt4 key购买 nike

我正在寻找一种方法来获取一个大对象并将其分解成较小的可变子对象,这些子对象可以并行处理。

类似于:

struct PixelBuffer { data:Vec<u32>, width:u32, height:u32 }
struct PixelBlock { data:Vec<u32> }
impl PixelBuffer {
fn decompose(&'a mut self) -> Vec<Guard<'a, PixelBlock>>> {
...
}
}

生成 PixelBlock 的地方的可以并行处理,父级 PixelBuffer将保持锁定状态,直到所有 Guard<PixelBlock>被丢弃。

这是有效的可变指针别名; PixelBuffer 中的大数据 block 将通过每个 PixelBlock 直接修改.

但是,每个 PixelBlock是来自 PixelBuffer 中内部数据的非重叠段.

您当然可以在不安全代码中执行此操作(内部缓冲区是原始指针;为每个 PixelBlock 生成一个新的外部指针);但是否有可能使用安全代码实现相同的结果?

(注意。如果有帮助,我愿意使用从 libc::malloc 分配的数据 block ?)

最佳答案

这工作正常并且是迭代器工作方式的自然结果:next方法发出一系列值,这些值与它们来自的引用没有生命周期关联,即 fn next(&mut self) -> Option<Self::Item> .这自动意味着任何产生 &mut 的迭代器指针(如 slice.iter_mut() )正在产生指向非重叠内存的指针,因为其他任何东西都是不正确的。

并行使用它的一种方法类似于我的 simple_parallel图书馆,例如 Pool::for_ .

(您需要提供有关 PixelBuffer 内部结构的更多详细信息,以便更具体地说明在这种情况下如何执行此操作。)

关于rust - 是否可以对非重叠内存进行安全的可变别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249546/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com