何时使用 Box<Vec<..>> 或 Vec<Box<..>>?
When to use Box<Vec<..>> or Vec<Box<..>>?
什么时候设计嵌套 Box
和 Vec
的数据结构才有意义(反之亦然)?
似乎在大多数情况下,你想在堆上存储多个固定大小的东西,Box
是多余的,因为它唯一的(?)作用是堆分配一个 ~single 值,并且正常的 Vec
已经在堆中分配它的存储空间。
上下文:我仍在思考各种 Rust 类型在构建数据结构方面的作用。
你真的只需要用几次Box
:
递归数据结构:与最外层元素无关,所以不需要Vec<Box<T>>
.
拥有的trait对象,必须是Box<Trait>
因为对象的大小是动态的;
对特定内存地址敏感的事物,以便包含的对象将保持相同的内存位置(实际上从来没有这种情况,在任何稳定的情况下绝对不是这种情况public API;一些与 std::sync::mpsc::Select
相关的句柄是我所知道的唯一情况;这种不安全和需要注意是 select!
存在的部分原因。这种事情(Handle.add
) 是不安全的东西。
如果 none 这些情况适用,您不应使用 Box
。 Box<Vec<T>>
就是这样一种情况;拳击是完全多余的,添加额外的间接级别没有任何好处。
所以简单的版本是:
Box<Vec<T>>
:从来没有。
Vec<Box<T>>
:仅当 T
是特征时,即您正在使用特征对象。
什么时候设计嵌套 Box
和 Vec
的数据结构才有意义(反之亦然)?
似乎在大多数情况下,你想在堆上存储多个固定大小的东西,Box
是多余的,因为它唯一的(?)作用是堆分配一个 ~single 值,并且正常的 Vec
已经在堆中分配它的存储空间。
上下文:我仍在思考各种 Rust 类型在构建数据结构方面的作用。
你真的只需要用几次Box
:
递归数据结构:与最外层元素无关,所以不需要
Vec<Box<T>>
.拥有的trait对象,必须是
Box<Trait>
因为对象的大小是动态的;对特定内存地址敏感的事物,以便包含的对象将保持相同的内存位置(实际上从来没有这种情况,在任何稳定的情况下绝对不是这种情况public API;一些与
std::sync::mpsc::Select
相关的句柄是我所知道的唯一情况;这种不安全和需要注意是select!
存在的部分原因。这种事情(Handle.add
) 是不安全的东西。
如果 none 这些情况适用,您不应使用 Box
。 Box<Vec<T>>
就是这样一种情况;拳击是完全多余的,添加额外的间接级别没有任何好处。
所以简单的版本是:
Box<Vec<T>>
:从来没有。Vec<Box<T>>
:仅当T
是特征时,即您正在使用特征对象。