我有一个大型固定大小数组,其中包含 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>>
的情况下识别出这一点。 ,它可以代表None
将 0 放入指针字段。 What is the overhead of Rust's Option type?包含更多信息。
指针指向的后备存储怎么样? A Vec
doesn't allocate (与第一个链接相同)当您使用 Vec::new
创建它时或Vec::with_capacity(0)
;在这种情况下,它使用特殊的非空“空指针”。 Vec
仅当您 push
时才在堆上分配空间某些东西或以其他方式强制它分配。因此,Vec
均使用了空间。其本身及其后备存储是相同的。
关于memory - 当第二个维度的大部分为空时,最节省内存的可空向量数组是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876592/