Rust: &,clone,Box,Arc 的address

来源:互联网 发布:自动拨号软件 编辑:程序博客网 时间:2024/06/07 18:49

一、&

    println!();    let temp = 500_i32;   //stack    println!("&temp               : {:p}", &temp);    println!("&&temp              : {:p}", &&temp);    println!("&&&temp             : {:p}", &&&temp);    println!("&&&&temp            : {:p}", &&&&temp);    let arr = vec!["a", "b", "c", "d"]; // heap     println!();    println!("&arr                : {:p}", &arr);    println!("&&arr               : {:p}", &&arr);    println!("&&&arr              : {:p}", &&&arr);    println!("&&&&arr             : {:p}", &&&&arr);

output:

这里写图片描述

二、原始数据及clone

//原始数据let mut array: [&str; 4] = ["a", "b", "c", "d"];let mut num = 5_f32;//clonelet array_clone = array.clone(); //clone:address和原来的不一样let num_clone = num.clone();//clone:address和原来的不一样

三、不同情况下array的address

 println!("&array address          :{:p}", &array); println!("&array_clone address    :{:p}", &array_clone); let array_new = &mut array;// address不发生变化 let array_new_clone = array_new.clone(); //address发生变化 println!("array_new address       :{:p}", array_new); println!("&array_new address      :{:p}", &array_new); println!("&array_new_clone address:{:p}", &array_new_clone); println!();

四、不同情况下num的address

//&println!("&num address            :{:p}", &num);println!("&num_clone address      :{:p}", &num_clone);//&mut,clonelet num_new = &mut num; // address不发生变化let num_new_clone = num_new.clone();// address发生变化// outputprintln!("num_new address         :{:p}", num_new);println!("&num_new address        :{:p}", &num_new);println!("&num_new_clone address  :{:p}", &num_new_clone);

output:

这里写图片描述

五、Box

    let mut bx = Box::new(5_f32);    let mut bx_new = &bx;    let mut bx_new_clone = bx_new.clone();    println!("bx <value> address  : {:p}", &*bx);//box中5_f32的地址    println!("bx address          : {:p}", &bx);//指针的指针    println!("bx_new address      : {:p}", &bx_new);    println!("bx_new_clone address: {:p}", &*bx_new_clone);

output:
这里写图片描述

六、Arc

以下例子参考RustPrimer

use std::thread;use std::sync::Arc;fn main() {    let var : Arc<i32> = Arc::new(5);    let share_var = var.clone();    // 创建一个新线程    let new_thread = thread::spawn(move|| {        println!("share value in new thread: {}, address: {:p}", share_var, &*share_var);    });    // 等待新建线程先执行    new_thread.join().unwrap();    println!("share value in main thread: {}, address: {:p}", var, &*var);}

output:

share value in new thread: 5, address: 0x2825070share value in main thread: 5, address: 0x2825070
原创粉丝点击