into_boxed_slice() 方法有什么用?

What is the use of into_boxed_slice() methods?

查看可用于 Vec<T> 的方法我偶然发现了

into_boxed_slice(self) -> Box<[T]>

String也有这样的方法(into_boxed_str(self))。将 Deref 用于 Vec<T>/String 的用处是显而易见的,它允许将它们视为共享切片 (&[T]),但我看不到任何用途拥有的切片 (Box<[T]>),也许 FFI 除外。 Rust GitHub repo 仅在少数情况下使用 into_boxed_slice()

由于 std 中提供了创建盒装切片的方法,并且此容器列在其主页上,我想我可能遗漏了一些有用的东西。在什么情况下我应该使用拥有的切片来支持 Vec<T>String

使用 into_boxed_slice() 的一个重要原因是盒装切片占用 与以下内存一样多的内存:

  • 底层数据本身
  • 给出数据总长度的length字段

当使用标准 Vec 时,Vec 可以获得比实际需要更多的内存,以避免每次新元素分配时分配更多内存添加。 space 基本上没有使用。您可以通过比较 Vec::len()Vec::capacity().

来了解使用了多少额外内存

我发现 into_boxed_slice() 函数有用的主要地方是内存中的文件缓存。为简单起见,我使用 Vec 将文件加载到内存中,但加载文件后,我不再需要添加或删除元素。所以我使用 into_boxed_slice() 将其转换为盒装切片。会有其他方法可以实现同样的事情,但在这种情况下,单个函数调用更容易。我喜欢盒装切片类型(而不是 Vec),因为它清楚地表明缓存文件不打算修改的意图。

注意:您实际上仍然可以通过调用 Vec::shrink_to_fit() 使用 Vec 而无需额外开销,这将从 Vec.

中删除额外分配的元素

我有一个应用程序,其中有数万个元素的 Vec,每个元素都可以是 VecBox<[T]>,所以我节省了数十万使用 into_boxed_slice.

字节