Я хочу написать простой пример для проверки перемещения объекта в памяти. Тут имеется ввиду, что я хочу узнать меняется ли адрес объекта, когда он передается от одного владельца к другому. По идее адрес меняться не должен, так как это перемещение существует только в исходном коде для ссылочных типов. Ссылочных в обычном смысле, для которых память выделена в куче и переменная ссылается на объект. Как раз что делает Box. Я ожидаю, что данные после перемещения должны лежать по тому же адресу фактически. Потому, что если Rust будет еще и данные в куче копировать, то это лишняя трата времени и это тогда совсем оптимизацией не является.
Но я не могу написать пример без вызова clone(), чтобы он скомпилировался.
#![allow(unused)]
fn main() {
let b = Box::new(4);
check_b(&b);
let c = b; // Здесь происходит move
check_c(&c);
}
fn check_c(val: &Box<i32>){
println!("address c: {}\n", Box::into_raw(val.clone()) as usize);
}
fn check_b(val: &Box<i32>){
println!("address b: {}\n", Box::into_raw(val.clone()) as usize);
}
А с вызовом clone() получается, что я не могу это проверить. Данные копируются:
address b: 104808743070512
address c: 104808743070544
Подскажите как переписать пример, чтобы можно было это проверить?
Спасибо