所有权是Rust最为与众不同的特性,Rust无需垃圾回收即可保障内存安全。
Rust通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。
堆栈区别
堆和栈都是程序在运行时可使用的内存。但是结构不同,栈中的数据占用的大小已知并且固定。
在编译时大小未知或者大小可能变化的数据,要改为存储在堆上。当向堆放入数据时,要请求一定大小的空间。系统在堆上找到一块足够大的内存标记为已使用,返回指向该位置的指针。
栈中的数据是连续的,堆中的数据是不连续的,取用堆中的数据效率较低。所有权就是为了管理堆上的数据,跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理不再使用的数据确保不会耗尽空间。
对于堆上的内存的申请与释放,Rust采用的是内存在拥有它的变量离开作用域之后就被自动释放。
Rust会在作用域的结尾调用 drop函数。RAII模式(资源在生命周期结束时释放资源的模式)。
右值引用 浅拷贝
let s1 = String::from("hello");
let s2 = s1; //相当于 s2 = move(s1)
Rust永远也不会自动创建数据的“深拷贝”。
克隆
let s1= String::from("hello");
let s2 = s1.clone(); //深拷贝
栈中的数据是深复制的,堆上的数据默认是浅拷贝,可以使用clone函数深拷贝。
引用
引用是对变量的绑定,但不拥有这个变量,在超出作用域之后不会释放变量的内存。
不允许修改引用的值。
将引用变为 mut 就可以改变了。
字符串slice是String中一部分值的引用
println!
println!宏能处理很多类型的格式,{}默认告诉println!使用Display的格式。结构体没有提供一个Display实现。
derive
Rust为我们提供了很多可以通过derive注解来使用的traits,可以为我们的自定义类型自定义实用的行为。
方法/函数
函数就是普通的函数,方法是定义于结构体上下文中,或者是枚举或trait对象的上下文,第一个参数总是self。
Rust有自动引用和解引用的地方。当用对象调用相应的方法时,objects.something()时,Rust会自动为object添加& &mut *为了使object和方法签名匹配。
枚举
enum IPAddrKind{
v4,
v6
}