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

奥尔普

假设我保证(通过未指定的方式)拥有一个[*mut T; N]包含N 有效和不相交的可变指针的类型数组,所有指针都带有lifetime '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在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(据我所知),因此我不希望使用它。

Frxstrem

理想情况下,您只需std::mem::transmute在这里使用,因为引用和指针具有相同的内存布局不幸的是,std::mem::transmute即使这两种类型具有相同的布局也不适用于通用数组。但是,您可以使用union方法来解决此问题,因为使用#[repr(C)]联合类似于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)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将可变大小的numpy数组转换为Tensorflow张量

如何将可变参数函数参数转换为数组?

MySQL将可变列转换为行

在Scala中将可变集合转换为不可变集合

在 Swift 中将可变结构转换为不可变结构

MS-Access使用VBA将可变行值动态转换为可变列值

为什么Rust无法在类型构造函数中将可变引用强制转换为不可变引用?

当我们永远不能同时拥有可变引用时,我们如何将可变引用强制转换为不可变引用?

将可变大小的字节数组转换为整数/长整数

如何在可变模板推导期间将指针隐式转换为 const 指针

将可变引用移出可变对象

使用一些过滤器将可变长度列表转换为字典

Amazon Athena - 无法将可变字符转换为日期

将可变数量的参数转换为显式数量

将可变参数类型列表转换为对的元组

将可变长度列表转换为R中的矩阵

将可变的列数从长转换为宽

ffmpeg将可变帧率.webm转换为恒定帧率视频

将可变长度元组的列表转换为字典

如何将可变状态转换为闭包?

将可变嵌套列表的大文件转换为JSON

将可变数组引用传递到也需要可变数组引用的函数中时,为什么不声明&mut?

转换为使用泛型

将可变参数解析为函数指针

将使用可变数据的代码转换为不可变的

Rust 将可变枚举引用与向量匹配

泛型和可变参数 - 如何使用子类

使用可变参数泛型进行方法返回专用化

Java是否可以使用可变参数泛型?