Appearance
Rust 所有权
所有权(系统)是 Rust 最独特的功能,可以使得 Rust 无需垃圾回收就可以保障内存的安全。因此,理解 Rust 中的所有权如何工作是十分的重要的。所欲全的功能:借用,slice,以及 Rust 如何在内存中布局数据的。
所有运行的程序都必须管理其使用计算机内存的方式,一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;还有一些语言程序员必须亲自分配和释放内存,例如 C 语言。Rust 则选择了第三种方式,通过所有权系统管理内存,编译器在编译的时候会根据一些列的规则进行检查。在运行的时候所有权系统的任何功能不会减慢程序。
了解了 Rust 的所有权系统的规则,我们就会很自然地写出安全高效的代码。
所有权规则:
- Rust 中的内一个值都有一个被称为其所有者的变量。
- 值有且只有一个所有者。
- 当所有者(变量)离开作用域,这个值将被丢弃。
String 类型
- string.clone
- String ptr,len, capacity
- 为什么整数类型不需要 clone 呢?
- 因为像整数类型在编译时一直大小的类型被整个存储在栈上,所以其拷贝其实际的值是最快的,也没有导致 x 失效。
rust
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
引用和借用
&
符号表示引用,它们允许你使用值但不获得其所有权。解引用*
。我们将获取引用作为函数 参数称为借用
(borrowing)。就像现实生活中一样,如果一个人拥有某样东西,你可以从他那里借来,当你使用完毕之后,你必须还回去。如果你需要尝试修改借用的变量?那么这个值必须是允许修改的可变引用。&mut s
。
限制允许可变性
rust
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
println!("{}, {}", r1, r2);
这是一种受限制的方式允许,这种方式的好处是避免数据竞争,数据竞争类似于竞争条件,可以由三个行为造成:
- 两个或者更多的指针同时访问同一个数据。
- 至少有一个指针被用来写入数据。
- 没有同步数据访问的机制。
{}
大括号可以创建新的作用域,这样允许拥有多个可变引用,但是不能同时引用。