Постоянно ли выделяется вектор ржавчины?

Я новичок в Rust и изучаю векторную реализацию. Я много раз пытался изменить размер вектора и проверить адреса элементов с помощью следующего кода:

fn main() {
    let mut vector = Vec::new();

    for i in 1..100 {
        println!(
            "Capacity:{}, len: {}, addr: {:p}",
            vector.capacity(),
            vector.len(),
            &vector,
        );
        vector.push(i);
    }
    println!("{:p}", &vector[90]);
}

Это дает мне вывод (последние 2 строки):

Capacity:128, len: 98, addr: 0x7ffebe7a6930
addr of 90-element: 0x5608b516bd08

Мой вопрос: почему 90-й элемент находится в другом месте памяти? Я предполагаю, что это должно быть где-то рядом с адресом 0x7ffebe7a6930.

В дополнение к ответу @IanS., имейте в виду, что когда вы вызываете Vec::new(), он предварительно выделяет некоторую память, и даже если он, вероятно, выделяет менее 100 элементов, он все равно может выделять больше и просто никогда не перераспределять. Может быть, ради эксперимента вам стоит начать с Vec::with_capacity(1) или чего-то в этом роде.

BlackBeans 17.05.2022 19:53

@BlackBeans Это неверно, Vec::new() задокументировано, что он не выделяется. См. третий абзац здесь.

Ian S. 17.05.2022 19:57

@IanS. ах, ну, мой плохой.

BlackBeans 17.05.2022 21:37
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да Vec хранит свои данные в непрерывном разделе памяти. &vector дает вам ссылку на реальную структуру Vec, которая находится в стеке и содержит емкость, указатель и длину. Если вместо этого вы напечатаете vector.as_ptr(), вы должны получить более понятный результат. Кроме того, вам, вероятно, следует нажать перед печатью в цикле, поскольку теоретически этот вызов push может перераспределиться на последней итерации, и тогда ваши указатели будут выглядеть другими.

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