获得徽章 0
- 在进行赋值(let x = y)或通过值来传递函数参数(foo(x))的时候,资源的所有权(ownership)会发生转移。
这里的赋值,也不可以一般化理解。例如:
let x = 5u32;
let y = x;
这里将x赋值给y,有所有权移动吗?
没有。
let a = Box::new(5i32);
let b = a;
这里将a赋值给b,发生了所有权移动了吗?
发生了
有什么不同?
前者变量在栈上,后者在堆上。前者变量赋值发生时,发生了栈复制。通过下面的示例,可以验证这一点。
fn main() {
// 栈分配的整型
let x = 5u32;
// 将 `x` *复制*到 `y`——不存在资源移动
let y = x;
println!("x:{}\ny:{}", &x as *const u32 as usize, &y as *const u32 as usize);
}
输出:
x:140701828575704
y:140701828575708
两个栈变量的地址是不一样的。展开评论4