gpt4 book ai didi

arrays - 使用 const 泛型将可变指针数组转换为可变引用

转载 作者:行者123 更新时间:2023-12-03 11:25:34 25 4
gpt4 key购买 nike

假设我保证(通过未指定的方式)我有一个类型为 [*mut T; 的数组N] 包含 N 有效且不相交的 可变指针,所有指针都具有生命周期 'a。如何将其转换为可变引用数组 [&'a mut T; N]?

换句话说,我该如何实现这个功能?

unsafe fn ptrs_to_refs<'a, T, const N: usize>(ptrs: [*mut T; N]) -> [&'a mut T; N] {
// What goes here?
}

我并不是特别在寻找使用分配步骤的实现(例如使用 Vec)。


因为 min_const_genericsset to stabilize在 Rust 1.51 中,这个问题针对的是一个假设的稳定 Rust,它也有 min_const_generics。我正在寻找符合这些要求的答案,不使用其他不稳定的功能。

例如具有特征 array_map一个人可以简单地

unsafe fn ptrs_to_refs<'a, T, const N: usize>(ptrs: [*mut T; N]) -> [&'a mut T; N] {
arr.map(|ptr| unsafe { &mut *ptr })
}

但由于它不会稳定到 1.51(据我所知)我不想使用它。

最佳答案

理想情况下,您只需使用 std::mem::transmute在这里,作为references and pointers have the same memory layout .不幸的是,std::mem::transmute 不适用于泛型数组,即使这两种类型具有相同的布局。但是,您可以使用 union 来解决这个问题,如 using a #[repr(C)] union is analogous to transmute :

#[repr(C)]
union Transmute<'a, T, const N: usize> {
ptr_arr: ManuallyDrop<[*mut T; N]>,
ref_arr: ManuallyDrop<[&'a mut T; N]>,
}

unsafe fn ptrs_to_refs<'a, T, const N: usize>(ptrs: [*mut T; N]) -> [&'a mut T; N] {
let u = Transmute::<'a, T, N> { ptr_arr: ManuallyDrop::new(ptrs) };
ManuallyDrop::into_inner(u.ref_arr)
}

您还可以使用 std::mem::transmute_copy ,在这里有效地做同样的事情:

unsafe fn ptrs_to_refs<'a, T, const N: usize>(ptrs: [*mut T; N]) -> [&'a mut T; N] {
std::mem::transmute_copy(&ptrs)
}

关于arrays - 使用 const 泛型将可变指针数组转换为可变引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65533516/

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