В примере программы для проверки этого я ожидал, что адрес вектора в куче должен измениться. Если, конечно, я правильно написал программу. Потому, что изначально у вектора нет вообще емкости и я добавляю элементы. По идее тут при превышении емкости больше 16, опять происходит перераспределение. А адрес не меняется. И если бы он менялся, тогда другой вопрос. А откуда компилятор тогда знает по какому адресу ссылаться на элементы вектора после перераспределения? Спасибо.
#![allow(unused)]
fn main() {
let mut vec = Vec::new();
assert_eq!(vec.len(), 0);
println!("\n{:?}", &vec);
println!("\nДлина вектора = {}", vec.len());
println!("Емкость вектора = {}", vec.capacity());
vec.push(1);
vec.push(2);
vec.push(1);
vec.push(2);
vec.push(1);
vec.push(2);
vec.push(1);
vec.push(2);
vec.push(1);
vec.push(2);
assert_eq!(vec.len(), 10);
println!("\n{:?}", vec);
println!("\nДлина вектора = {}", vec.len());
println!("Емкость вектора = {}", vec.capacity());
println!("Адрес вектора = {:p}", &vec[0]);
vec.push(2);
vec.push(1);
vec.push(2);
vec.push(1);
vec.push(2);
vec.push(1);
vec.push(2);
assert_eq!(vec.len(), 17);
println!("\n{:?}", vec);
println!("\nДлина вектора = {}", vec.len());
println!("Емкость вектора = {}", vec.capacity());
println!("Адрес вектора = {:p}", &vec[0]);
}
Вывод
[]
Длина вектора = 0
Емкость вектора = 0
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
Длина вектора = 10
Емкость вектора = 16
Адрес вектора = 0x58b235667b10
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2]
Длина вектора = 17
Емкость вектора = 32
Адрес вектора = 0x58b235667b10