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

标签 arrays rust reference

假设我保证(通过未指定的方式)我有一个类型为 [*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/

相关文章:

methods - 无论如何, “context”和 “with_context”有什么区别?

multithreading - 如何在两个线程之间共享或避免共享Websocket资源?

c# - 哪个更好,返回值或输出参数?

c - 通过引用传递变量的错误

python - Python 中的变量复制究竟是如何工作的?

Java:如何创建最终子数组?

rust - 在 Rust 的结构中查找最常出现的字符串?

php - 命中计数器sql错误

python - 在没有numpy的情况下更改对角线方阵 - Python

c# - 为什么 UInt16 数组的加法速度似乎比 int 数组快?