Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初始化Rust中DST的大小成员(在堆上)_Rust_Heap_Offset_Allocation_Raw Pointer - Fatal编程技术网

初始化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
    版本更有效吗?如果没有,那么为什么我计算了错误的解引用,或者编译器优化了它们

  • 有没有一种方法可以直接在堆上分配这样的DST,并将切片分配为特定大小。更具体地说(如果是这样的话),比如说
    Node
    在切片之前有多个大小的成员,如果编译器可能已经进行了一些重新排序,我如何
    ptr.write(…)
    其中的任何一个(以避免丢弃未初始化的位)

  • 我相信第二个问题与关于偏移量的讨论有关但我不确定