Инициализировать размерных членов DST в Rust (в куче) - PullRequest
1 голос
/ 16 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...