4

我正在尝试实现一个块列表,也就是一个链表,其中每个节点包含多个元素,一个链表和一个Vec.

执行此操作的直观方法是:

pub struct Node<T> {
    next: /* ref to next node */,
    data: Vec<T>,
}

这里的问题是,要从对节点的引用访问向量的元素,需要 2 个解引用操作:第一个解引用实际节点,第二个解引用向量的堆存储切片。

我的解决方案是定义Node<T>为 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

这使得初始化结构很有趣,因为它不能在堆栈上实例化。

我已经尝试了两种实验box语法,std::alloc::alloc但都没有成功。

我的问题如下:忽略所有好的做法,

  1. 这实际上是否比Vec版本更有效,如果没有,那么为什么,我是否误算了取消引用或者编译器是否优化了它们?

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

我相信第二个问题与讨论有关,offset_of!但我不确定。

4

0 回答 0