gpt4 book ai didi

rust - 如何创建一个 Box>

转载 作者:行者123 更新时间:2023-12-04 16:36:38 27 4
gpt4 key购买 nike

创建常规盒装切片(即 Box<[T]> )的推荐方法似乎是先创建一个 std::Vec<T> ,并使用 .into_boxed_slice() .但是,如果我希望将切片包装在 UnsafeCell 中,则与此类似的任何东西似乎都不起作用。

使用不安全代码的解决方案很好,但我真的很想避免手动管理内存。

最佳答案

创建 Box<[T]> 的唯一(并非不安全)方法通过 Box::from ,给定一个 &[T]作为参数。这是因为 [T]?Sized并且不能传递参数。这反过来又有效地需要 T: Copy ,因为 T必须从引用后面复制到新的 Box .但是UnsafeCell不是 Copy ,无论是否 T是。关于制作的讨论UnsafeCell Copy出于安全考虑,已经进行了多年,没有得出最终结论。

如果你真的非常想要一个Box<UnsafeCell<[T]>> ,只有两种方式:

  • 因为BoxUnsafeCell都是 CoerceUnsize , 和 [T; N] Unsize , 你可以创建一个 Box<UnsafeCell<[T; N]>>并将其强制为 Box<UnsafeCell<[T]> .这会限制您从固定大小的数组进行初始化。

Unsize 强制:

fn main() {
use std::cell::UnsafeCell;
let x: [u8;3] = [1,2,3];
let c: Box<UnsafeCell<[_]>> = Box::new(UnsafeCell::new(x));
}
  • 因为UnsafeCell #[repr(transparent)] , 你可以创建一个 Box<[T]>并将其不安全地突变为 Box<UnsafeCell<[T]> , 作为 UnsafeCell<[T]>保证与 [T] 具有相同的内存布局,鉴于 [T]不使用利基值(即使 T 使用)。

转化:

// enclose the transmute in a function accepting and returning proper type-pairs
fn into_boxed_unsafecell<T>(inp: Box<[T]>) -> Box<UnsafeCell<[T]>> {
unsafe {
mem::transmute(inp)
}
}

fn main() {
let x = vec![1,2,3];
let b = x.into_boxed_slice();
let c: Box<UnsafeCell<[_]>> = into_boxed_unsafecell(b);
}

说了这么多:我强烈建议您患有 xy-problem . Box<UnsafeCell<[T]>>是一种非常奇怪的类型(尤其是与 UnsafeCell<Box<[T]>> 相比)。您可能想要详细说明您尝试使用这种类型完成的任务。

关于rust - 如何创建一个 Box<UnsafeCell<[T]>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69107249/

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