При перемещении адрес на стеке изменится, а адрес памяти выделенной на куче - нет.
Тут очень тонкий момент, который нужно понимать, данные которые мы помещаем в Box или Vec будут размещены на куче, но сами Box и Vec - это такие же структуры, как и любые другие, просто на них есть некоторая логика для управления памятью на куче, в случае 64 битной архитектуры и
T: Sized
,
Box<T>
будет занимать 8 байт на стеке и размер T на куче, а
Vec<T>
- 24 байта на стеке (указатель на начало, длина и фактически выделенная память) и размер T умноженный на capacity на куче.
fn main() {
let a = Box::new(42);
println!("Stack address of a: {:p}", &a);
println!("Heap address of a: {:p}", &*a);
let b = a;
println!("Stack address of b: {:p}", &b);
println!("Heap address of b: {:p}", &*b);
}
Stack address of a: 0x7fff59586010
Heap address of a: 0x58cf76717b10
Stack address of b: 0x7fff59586018
Heap address of b: 0x58cf76717b10