Как я могу загрузить в стек все записи Vec <T> произвольной длины?

В настоящее время я работаю с векторами и пытаюсь убедиться, что у меня есть то, что по сути является массивом моего вектора в стеке. Я не могу позвонить Vec::into_boxed_sliceтак как я динамически выделяю место в моем. Это вообще возможно?

Прочитав Rustonomicon о том, как реализовать, кажется, что он обходит указатели в куче, разыменовывая каждую запись . Я хочу вмешаться Vec записи из кучи в стек для быстрого доступа.

1 ответ

Решение

Вы можете использовать особенность ночного Rust:

      #![feature(unsized_locals)]

fn example<T>(v: Vec<T>) {
    let s: [T] = *v.into_boxed_slice();
    dbg!(std::mem::size_of_val(&s));
}

fn main() {
    let x = vec![42; 100];
    example(x); // Prints 400
}

Смотрите также:


Я не могу позвонить так как я динамически выделяю место в моем

Что вы можете.

[...] кажется, идет по указателям в куче, разыменовывая при каждой записи

Для доступа к каждому члену в a требуется разыменование памяти. Для доступа к каждому члену в массиве требуется разыменование памяти. Материальной разницы в скорости здесь нет.

для быстрого доступа

Я сомневаюсь, что это будет быстрее, чем прямой доступ к данным в . На самом деле, я бы не удивился, если бы он был медленнее, поскольку вы его копируете.

Другие вопросы по тегам