创建空盒装切片
Create empty boxed slice
创建空 Box<[T]>
的最规范方法是什么?这样的盒子实际上应该变成一个长度为零的悬空指针,什么都不应该分配,对吧?
What is the most canonical way to create Box<[T]> which is empty?
Box::from()
或 slice::into()
.
Such box should effectively just become a dangling pointer with zero length and nothing should be allocated, right?
没有。 [T]
是一个slice,也就是一个DST。在这种情况下,Box
将是一个胖指针,盒子本身保存元数据(切片的大小):
let ar = [0;5];
let boxed: Box<[_]> = ar[..].into();
println!("{}", std::mem::size_of_val(&boxed));
将打印 16,即使底层切片为空(例如 ar[..0]
)。
但是,如果值是 ZST(例如 Box<[_;0]>
),那么确实存在不分配的特殊情况:https://github.com/rust-lang/rust/blob/9c09c1f7cfcf9de0522bcd1cfda32b552195c464/library/alloc/src/alloc.rs#L163
创建空 Box<[T]>
的最规范方法是什么?这样的盒子实际上应该变成一个长度为零的悬空指针,什么都不应该分配,对吧?
What is the most canonical way to create Box<[T]> which is empty?
Box::from()
或 slice::into()
.
Such box should effectively just become a dangling pointer with zero length and nothing should be allocated, right?
没有。 [T]
是一个slice,也就是一个DST。在这种情况下,Box
将是一个胖指针,盒子本身保存元数据(切片的大小):
let ar = [0;5];
let boxed: Box<[_]> = ar[..].into();
println!("{}", std::mem::size_of_val(&boxed));
将打印 16,即使底层切片为空(例如 ar[..0]
)。
但是,如果值是 ZST(例如 Box<[_;0]>
),那么确实存在不分配的特殊情况:https://github.com/rust-lang/rust/blob/9c09c1f7cfcf9de0522bcd1cfda32b552195c464/library/alloc/src/alloc.rs#L163