memory - 当第二个维度的大部分为空时,最节省内存的可空向量数组是什么?

标签 memory rust

我有一个大型固定大小数组,其中包含 u32 的可变大小数组。大多数第二维数组将为空(即第一个数组将稀疏填充)。我认为Vec是最适合两个维度的类型 ( Vec<Vec<u32>> )。因为我的第一个数组可能非常大,所以我想找到最节省空间的方法来表示它。

我看到两个选项:

  1. 我可以使用Vec<Option<Vec<u32>>> 。我猜是Option是一个标记联合,这将导致每个单元格 sizeof(Vec<u32>)向上舍入到标记的下一个单词边界。

  2. 我可以直接使用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/

相关文章:

linux - 查找视频缓冲区的物理内存偏移量

rust - u128 数字是如何存储在内存中的?

rust - Inmutable 和 Mutable 在调用 "const"方法时借用 "const"参数

rust - new() 方法返回通用 'impl trait' 值

rust - 如何在 Rust 中使用返回类型为 `Fn` 的 `impl trait` 特征?

rust - 关于理解生命周期的问题

.net - 如何解决 .NET Webbrowser 控件中的内存泄漏问题?

python - 为类型化内存 View 分配内存的推荐方法是什么?

swift - 检查一个应用程序的文档和数据 : STACK-LOGS?

java - 在 Java 中,确定对象大小的最佳方法是什么?