【问题标题】:What is the use of into_boxed_slice() methods?into_boxed_slice() 方法有什么用?
【发布时间】:2017-01-29 15:38:24
【问题描述】:

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

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

String也有这样的方法(into_boxed_str(self))。将Deref 用于Vec&lt;T&gt;/String 的用处是显而易见的,这使得它们可以被视为共享切片(&amp;[T]),但我认为拥有的切片没有任何用处(Box&lt;[T]&gt;)除了,也许,FFI。 Rust GitHub 存储库仅在少数情况下使用 into_boxed_slice()

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

【问题讨论】:

  • 不确定是否是原因,但Box&lt;[T]&gt;Box&lt;str&gt; 的指针大小少了一个整数,因为它们不需要容量——它们不能调整大小。
  • 我想过这个,但我也觉得这不足以成为拥有专用容器的理由。
  • 我不确定您所说的“专用容器”是什么意思。它只是现有类型的组合 - Box[T]str。它与Box&lt;Trait&gt; 并没有什么不同。
  • 你说得对,虽然是在std的主页上列出来,给人一种高贵的感觉:)。这就是我对它感兴趣的原因。
  • 我猜这可能只是为了获取底层堆指针的一种廉价、安全的方式。实际上是一种“into_inner”方法。可能会提供以防有人真的想拥有底层缓冲区,因为它实施起来很简单。

标签: types rust containers slice boxing


【解决方案1】:

我有一个应用程序,我有一个包含数万个元素的Vec,每个元素都可以是VecBox&lt;[T]&gt;,因此我使用into_boxed_slice 节省了数十万字节。

【讨论】:

    【解决方案2】:

    使用into_boxed_slice() 的主要原因是盒装切片占用的内存与:

    • 基础数据本身
    • length 字段,提供数据的总长度

    当使用标准的Vec 时,Vec 获得比实际需要更多的内存是可能的并且很常见,以避免每次添加新元素时都必须分配更多的内存。该空间基本上是未使用的。您可以通过比较 Vec::len()Vec::capacity() 来了解使用了多少额外内存。

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

    注意:您实际上仍然可以通过调用Vec::shrink_to_fit() 来使用Vec 而没有额外开销,这将从Vec 中删除额外分配的元素。

    【讨论】:

    • 如果我没记错的话,into_boxed_slice() 也会调用shrink_to_fit()。这是一个有效的答案;我希望能学到一些隐藏的好处,但可能没有。如果很快不出意外的话我会接受的。
    猜你喜欢
    • 2013-12-09
    • 2013-03-02
    • 1970-01-01
    • 2010-12-13
    • 2010-10-27
    • 2016-10-12
    • 2015-04-07
    相关资源
    最近更新 更多