При превышении capacity адрес
может измениться.
Довольно банальная оптимизация - если впереди необходимая память свободна, расширение происходит на месте, без переноса.
Проверить можно так
fn main() {
let mut vec = Vec::with_capacity(2);
let initial_ptr = vec.as_ptr();
let (new_ptr, new_capacity) = std::iter::repeat(())
.enumerate()
.find_map(|(i, _)| {
vec.push(i as i32 + 3);
(vec.as_ptr() != initial_ptr).then(|| (vec.as_ptr(), vec.capacity()))
})
.unwrap();
println!("Initial ptr: {:?}", initial_ptr);
println!("New ptr: {:?}", new_ptr);
println!("New capacity: {}", new_capacity);
}