我有一个固定大小的可变数组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放在指针字段中来表示NoneWhat is the overhead of Rust's Option type?包含更多信息。

    指针指向的后备存储如何?使用VecVec::new创建A Vec::with_capacity(0) doesn't allocate(与第一个链接相同)时;在这种情况下,它将使用特殊的非空“空指针”。 Vec仅在您对push进行某些操作或以其他方式强制对其进行分配时才在堆上分配空间。因此,用于Vec本身及其后备存储的空间是相同的。

    关于memory - 当第二维的大部分为空时,可空向量的内存效率最高的数组是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47876592/

    10-15 08:02