Я пытаюсь реализовать список чанков, то есть связанный список, где каждый узел содержит несколько элементов, компромисс между связанным списком и 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!
, но я не уверен.