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

When to use Box<Vec<..>> or Vec<Box<..>>?

什么时候设计嵌套 BoxVec 的数据结构才有意义(反之亦然)?

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

上下文:我仍在思考各种 Rust 类型在构建数据结构方面的作用。

你真的只需要用几次Box:

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

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

  • 对特定内存地址敏感的事物,以便包含的对象将保持相同的内存位置(实际上从来没有这种情况,在任何稳定的情况下绝对不是这种情况public API;一些与 std::sync::mpsc::Select 相关的句柄是我所知道的唯一情况;这种不安全和需要注意是 select! 存在的部分原因。这种事情(Handle.add) 是不安全的东西。

如果 none 这些情况适用,您不应使用 BoxBox<Vec<T>> 就是这样一种情况;拳击是完全多余的,添加额外的间接级别没有任何好处。

所以简单的版本是:

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