初始化Rust中DST的大小成员(在堆上)
我试图实现一个区块列表,也称为链表,其中每个节点都包含多个元素,在链表和初始化Rust中DST的大小成员(在堆上),rust,heap,offset,allocation,raw-pointer,Rust,Heap,Offset,Allocation,Raw Pointer,我试图实现一个区块列表,也称为链表,其中每个节点都包含多个元素,在链表和Vec之间进行折衷 直观的方法是: pub struct Node<T> { next: /* ref to next node */, data: Vec<T>, } pub结构节点{ 下一个:/*参考下一个节点*/,, 资料来源:Vec, } 这里的问题是,要从对节点的引用访问向量的元素,需要两个解引用操作:第一个解引用实际节点,第二个解引用向量的堆存储切片 我的解决方案是将节
Vec
之间进行折衷
直观的方法是:
pub struct Node<T> {
next: /* ref to next node */,
data: Vec<T>,
}
pub结构节点{
下一个:/*参考下一个节点*/,,
资料来源:Vec,
}
这里的问题是,要从对节点的引用访问向量的元素,需要两个解引用操作:第一个解引用实际节点,第二个解引用向量的堆存储切片
我的解决方案是将节点
定义为DST,其最后一个字段是切片:
pub struct Node<T> {
next: /* ref to next node */,
data: [T],
}
// this Node is a DST, it doesn't have a size known at compile time
// and it always needs to be handled behind a pointer, say Box for ownership
pub结构节点{
下一个:/*参考下一个节点*/,,
数据:[T],
}
//此节点是DST,它在编译时没有已知的大小
//而且它总是需要在指针后面处理,比如说所有权框
这使得初始化结构很有趣,因为它不能在堆栈上实例化
我已经尝试了实验性的box
语法和std::alloc::alloc
,但都没有成功
我的问题是:忽视所有良好实践
Vec
版本更有效吗?如果没有,那么为什么我计算了错误的解引用,或者编译器优化了它们Node
在切片之前有多个大小的成员,如果编译器可能已经进行了一些重新排序,我如何ptr.write(…)
其中的任何一个(以避免丢弃未初始化的位)