【问题标题】:When to use Box<Vec<..>> or Vec<Box<..>>?何时使用 Box<Vec<..>> 或 Vec<Box<..>>?
【发布时间】:2015-04-24 12:47:32
【问题描述】:

何时设计一个嵌套BoxVec(反之亦然)的数据结构有意义?

在大多数情况下,如果你想在堆上存储多个固定大小的东西,Box 是多余的,因为它的唯一(?)作用是堆分配一个~单个值,一个正常的Vec 已经在堆分配它的存储空间。

背景:我仍在思考各种 Rust 类型在构建数据结构时的作用。

【问题讨论】:

  • 我能想到的唯一用例涉及不安全的行为,例如即使Vec 重新分配,也希望堆的对象具有固定的指针位置。

标签: data-structures rust


【解决方案1】:

确实只有几次你需要使用Box

  • 递归数据结构:与最外层元素无关,因此不需要Vec&lt;Box&lt;T&gt;&gt;

  • 拥有的trait对象,必须是Box&lt;Trait&gt;,因为对象的大小是动态的;

  • 对特定内存地址敏感的东西,以便包含的对象保持相同的内存位置(实际上从来没有这种情况,在任何稳定的公共 API 中绝对不是这种情况;一些处理的事情要做std::sync::mpsc::Select 是我知道的唯一情况;这种不安全和需要小心是select! 存在的部分原因。这种事情 (Handle.add) 是不安全的东西。

如果这些情况都不适用,你不应该使用Box。而Box&lt;Vec&lt;T&gt;&gt; 就是这样一种情况;拳击完全是多余的,增加了一层额外的间接性,没有任何好处。

所以简单的版本是:

  • Box&lt;Vec&lt;T&gt;&gt;:从不。
  • Vec&lt;Box&lt;T&gt;&gt;:仅当 T 是一个特征时,即您正在使用特征对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多