范围中的变量超出范围时是否会复制到不同的内存位置?

时间:2017-08-26 06:47:50

标签: rust

在以下代码中

fn main() {
    let a = get_int();
    address_of(&a);
}
fn get_int() -> i32 {
    let a = 1;
    println!("{:p}", &a);
    a
}
fn address_of<A>(a: &A){
    println!("{:p}", a);
}

输出

0x7fff51d1ba94
0x7fff51d1bb1c

为什么打印相同值时内存地址会有所不同?这是否意味着范围中的变量超出范围时将被复制到不同的内存位置?

2 个答案:

答案 0 :(得分:1)

是的,Rust按值传递变量。因此,如果您返回一个变量,它将获得一个不同的内存地址。

答案 1 :(得分:0)

要添加到@MSathieu's answer,按值返回的Rust值移动到另一个位置。如果您在堆中分配了内存并打印了引用的值,它们将保持不变:

fn main() {
    let a = get_int();
    address_of(&(*a));
}
fn get_int() -> Box<i32> {
    let a = Box::new(10);
    println!("{:p}", a);
    a
}
fn address_of<A>(a: &A){
    println!("{:p}", a);
}

打印:

0x7fc9a6c1f008 
0x7fc9a6c1f008

Box本身在这里按值移动,但其中的引用保持不变: - )