首发于个人rust 学习日记git
规则
- Rust 中的每个值都有一个被称为其 全部者(owner)的变量。
- 值有且只有一个全部者。
- 当全部者(变量)离开做用域,这个值将被丢弃。(Rust 在结尾的 }处自动调用 drop释放内存)
- 移动(堆内存变量),当值(s1)被赋值给另一个变量(s2)后,rust则认为变量s1,再也不有效。
- 栈类型变量无移动的说法(没有深浅拷贝的区别)
- 将值传递给函数在语义上与给变量赋值类似
变量与数据的交互(move)
- 图1-2(s1和s2的引用图(错误)其余语言js\go 是这样的)
- 图1-3(s1和s2的引用图(正确)rust 是这样的,s1赋值s2后,Rust 则认为 s1 再也不有效)
当值(s1)被赋值给另一个变量(s2)后,rust则认为变量s1,再也不有效(图1-3)
克隆(深拷贝)
- 实现以下图,赋值变量的同时,进行数据拷贝的方案,rust也是支持的
- 这段代码能正常运行,产生的变量内存如图1-4
fn main() {
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);
}
复制代码
- 图1-4
栈类型变量无移动的说法(纯拷贝)
- x,y是编译时肯定大小的类型,所以整个存储在栈上,因此拷贝其实际的值是快速的。所以rust对栈变量进行纯拷贝,便不会形成性能的影响。
- 也就意味着建立变量 y 后, 不必使x 无效。
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
复制代码
将值传递给函数在语义上与给变量赋值类似
fn main() {
let s = String::from("hello");
run_move(s);
let x = 5;
run_copy(x);
println!("x:{}",x);
}
fn run_move(some_string: String) {
println!("run_move:{}", some_string);
}
fn run_copy(some_integer: i32) {
println!("run_copy:{}", some_integer);
}
复制代码