创建空盒装切片

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