'Create empty boxed slice [closed]
What is the most canonical way to create Box<[T]> which is empty? Such box should effectively just become a dangling pointer with zero length and nothing should be allocated, right?
Solution 1:[1]
What is the most canonical way to create Box<[T]> which is empty?
Box::from() or slice::into().
Such box should effectively just become a dangling pointer with zero length and nothing should be allocated, right?
No. [T] is a slice, which is a DST. In such a case, Box would be a fat pointer, with box itself holding the metadata (the size of the slice):
let ar = [0;5];
let boxed: Box<[_]> = ar[..].into();
println!("{}", std::mem::size_of_val(&boxed));
will print 16, even if the underlying slice is empty (e.g. ar[..0]).
If the value is a ZST however (e.g. Box<[_;0]>) then there is indeed a special case to not allocate: https://github.com/rust-lang/rust/blob/9c09c1f7cfcf9de0522bcd1cfda32b552195c464/library/alloc/src/alloc.rs#L163
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Masklinn |
