4

各ノードに複数の要素が含まれるリンクリストとも呼ばれるチャンクリストを実装しようとしています。これは、リンクリストとVec.

これを行う直感的な方法は次のとおりです。

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

ここでの問題は、ノードへの参照からベクターの要素にアクセスするには、2 つの逆参照操作が必要であるという事実です。1 つ目は実際のノードを逆参照し、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(...)。コンパイラーが並べ替えを行った可能性がある場合、それらのいずれかを(初期化されていないビットのドロップを避けるために)どのようにすればよいですか?

2番目の質問は議論に関連していると思いますoffset_of!が、よくわかりません。

4

0 に答える 0