- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
创建常规盒装切片(即 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]>>
,只有两种方式:
Box
和 UnsafeCell
都是 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/
UnsafeCell documentation说 The UnsafeCell type is the only legal way to obtain aliasable data that is
创建常规盒装切片(即 Box )的推荐方法似乎是先创建一个 std::Vec ,并使用 .into_boxed_slice() .但是,如果我希望将切片包装在 UnsafeCell 中,则与此类似的任
recent question正在寻找构建自我参照结构的能力。在讨论问题的可能答案时,一个可能的答案涉及使用 UnsafeCell 用于内部可变性,然后通过 transmute “丢弃”可变性. 这是
我是一名优秀的程序员,十分优秀!