我有一个固定大小的可变数组u32
的大型数组。多数第二维数组将为空(即,第一维数组将被稀疏地填充)。我认为Vec
是两个维度(Vec<Vec<u32>>
)最合适的类型。因为我的第一个数组可能很大,所以我想找到最节省空间的方法来表示它。
我看到两个选择:
Vec<Option<Vec<u32>>>
。我猜因为Option
是一个带标签的联合,这将导致每个单元格被sizeof(Vec<u32>)
舍入到标签的下一个单词边界。 Vec::with_capacity(0)
。空的Vec
在使用之前是否分配零堆吗? 哪种方法最节省空间?
最佳答案
实际上,Vec<Vec<T>>
和Vec<Option<Vec<T>>>
具有相同的空间效率。
A Vec
contains a pointer that will never be null,因此编译器足够聪明,可以识别出在Option<Vec<T>>
的情况下,可以通过将0放在指针字段中来表示None
。 What is the overhead of Rust's Option type?包含更多信息。
指针指向的后备存储如何?使用Vec
或Vec::new
创建A Vec::with_capacity(0)
doesn't allocate(与第一个链接相同)时;在这种情况下,它将使用特殊的非空“空指针”。 Vec
仅在您对push
进行某些操作或以其他方式强制对其进行分配时才在堆上分配空间。因此,用于Vec
本身及其后备存储的空间是相同的。
关于memory - 当第二维的大部分为空时,可空向量的内存效率最高的数组是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47876592/