我正在尝试实现一个块列表,也就是一个链表,其中每个节点包含多个元素,一个链表和一个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
但都没有成功。
我的问题如下:忽略所有好的做法,
这实际上是否比
Vec
版本更有效,如果没有,那么为什么,我是否误算了取消引用或者编译器是否优化了它们?有没有办法直接在堆上分配这样的 DST,并将切片分配为特定大小。更具体地说(如果这是要走的路),比如说
Node
在切片之前有多个大小的成员,如果编译器可能已经进行了一些重新排序,我怎么能ptr.write(...)
其中任何一个(以避免丢弃未初始化的位)?
我相信第二个问题与讨论有关,offset_of!
但我不确定。