何时设计嵌套 Box 和 Vec (或反之亦然)的数据结构是否有意义?
Box
Vec
在大多数情况下,你想要在堆上存储多个固定大小的东西, Box 是多余的,因为它的唯一(?)角色是堆分配〜单值,而正常 Vec 已经是堆分配它的存储空间 .
上下文:我仍然围绕着各种Rust类型的角色来构建数据结构 .
实际上只需要几次使用 Box :
递归数据结构:与最外层元素无关,因此不需要 Vec<Box<T>> .
Vec<Box<T>>
拥有的特征对象,必须是 Box<Trait> ,因为对象的大小是动态的;
Box<Trait>
对特定内存地址敏感的东西,以便包含的对象将保持相同的内存位置(实际上绝不是这种情况,绝对不是任何稳定的公共API中的情况;与 std::sync::mpsc::Select 有关的一些句柄是唯一的我知道的情况;这种不安全和需要的照顾是select!存在的一部分 . 这种事情( Handle.add )是不安全的东西 .
std::sync::mpsc::Select
Handle.add
如果这些情况都不适用,则不应使用 Box . Box<Vec<T>> 就是这样一个案例;拳击是完全多余的,增加了额外的间接水平,没有任何好处 .
Box<Vec<T>>
所以简单的版本是:
Box<Vec<T>> :从不 .
Vec<Box<T>> :仅当 T 是特征时,即您正在使用特征对象 .
T
1 回答
实际上只需要几次使用
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
是特征时,即您正在使用特征对象 .