何时使用Box <Vec <.. >>或Vec <Box <.. >>?

And*_*ner 4 rust data-structures

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

在大多数情况下,您希望在堆上存储多个固定大小的东西,这Box是多余的,因为它的唯一(?)角色是堆分配〜单个值,而正常Vec已经堆分配它的存储.

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

Chr*_*gan 8

您只需要使用几次Box:

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

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

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

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

所以简单的版本是:

  • Box<Vec<T>>:永远不会.
  • Vec<Box<T>>:只有当它T是一个特征时,即你正在使用特征对象.