作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我保证(通过未指定的方式)我有一个类型为 [*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_generics
是 set 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/
我是一名优秀的程序员,十分优秀!