何时使用Box <vec <..>&gt;或者Vec <box <..>&gt;?

时间:2015-04-24 12:47:32

标签: data-structures rust

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

在大多数情况下,您希望在堆上存储多个固定大小的东西,Box是多余的,因为它只有(?)角色是堆分配〜单个值,并且正常Vec已经在堆分配它的存储空间。

上下文:我仍然围绕着各种Rust类型的角色来构建数据结构。

1 个答案:

答案 0 :(得分:8)

您只需要使用Box

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

  • 拥有的特征对象,必须为Box<Trait>,因为对象的大小是动态的;

  • 对特定内存地址敏感的东西,以便所包含的对象保持相同的内存位置(实际上绝不是这种情况,绝对不是任何稳定的公共API中的情况;一些句柄要做的事情使用std::sync::mpsc::Select是唯一我知道的情况;这种不安全和需要的照顾是select!存在的原因的一部分。这种事情(Handle.add)是不安全的东西。< / p>

如果这些情况都不适用,则不应使用Box 。而Box<Vec<T>>就是这样一个案例;拳击是完全多余的,增加了额外的间接水平,没有任何好处。

所以简单的版本是:

  • Box<Vec<T>>:never。
  • Vec<Box<T>>:仅当T是特征时,即您正在使用特征对象。