目录
引用
1.任意给定的时间只能有一个可变引用或者多个不可变引用
2.引用必须总是有效的
不能在拥有不可变引用的时候创建可变引用
一个引用的生命周期是从创建到最后一次使用为止,因此在不可变引用之后创建可变引用是可行的
let mut s = String::from("hello");let r1 = &s; // 没问题let r2 = &s; // 没问题println!("{r1} and {r2}");// 此位置之后 r1 和 r2 不再使用let r3 = &mut s; // 没问题println!("{r3}");悬垂指针
Rust不会有悬垂指针
fn main() { let reference_to_nothing = dangle();//返回一个字符串的引用}fn dangle() -> &String {//返回值是一个字符串的引用 let s = String::from("hello");//创建字符,生命周期是自定义函数的作用域 &s//返回字符串的引用}//此时s销毁!//危险!因为所有权还在s手上,但是s已经销毁了!因此reference指向了一个无效的String,编译器不允许这样的事情发生。
解决办法是直接返回整个字符串即可
fn main() { let str = dangle();}fn dangle -> String { let s = String::from("hello"); s}这样所有权就转移到了str手中
结构体
可变与否是整个结构体的
C结构体
定义:
struct User { active: bool, username: String, email: String, sign_in_count: u64,}创建实例:
fn main(){ let user1 = User { active: true, username: String::from("someusername123"), email: String::from("someone@example.com"), sign_in_count: 1, };}获取特定值可以用点号,比如user1.email
字段初始化简写:
fn bulid_user(email:String, username:String) { User{ active: true, username, //因为email字段和email参数有相同的名称,因此只需编写email而不是email:email email, sign_in_count: 1, }
}结构体更新语法:(使用旧实例的大部分值但改变其部分值)
fn main() { // -- snip --
let user2 = User { active: user1.active, username: user1.username, email: String::from("another@example.com"), sign_in_count: user1.sign_in_count, }}
//优化为:
fn main() { // -- snip --
let user2 = User { email: String::from("another@example.com"), ..user1 }}这相当于赋值的=,更新之后的user1是不能使用的,因为移动了数据,但如果是上面的赋值,只复用user1的active和sign_in_count的话,由于具有Copy trait属性,因此user1仍然有效。
元组结构体:(没有命名字段)
定义:
struct Color(i32, i32, i32);struct Point(i32, i32, i32);fn main() { let black = Color(0, 0, 0); let origin = Point(0, 0, 0);}解构:(必须指明结构体的类型)
let Point(x, y, z) = origin;//必须指明是Point访问单独的值:.
类单元结构体
类似于元组的unit:(),没有任何字段
定义:
struct UnitLikeStruct;Rust中的基本线程操作
在线程中使用Mutex
Rust中线程间通信
并发共享虚拟异步
单核:
执行流:栈帧和cpu寄存器存储的执行记录
上下文切换:并发因此不是一个执行流一口气走到底。
要在两个执行流中分时间分配CPU,执行流的切换
单核的简单做法:禁止切换和调度,某种意义上的上锁
多核更加复杂《深入理解计算机体系结构》
CPU core-L1 catch-L2 catch-簇-L3 catch -memory
乱序执行和强弱内存模型
乱序执行:本身是单核的事情,期望的是A指令->B指令,但是现在重排顺序乱了,没有依赖关系的话乱了就乱了
在多核情况问题暴露更加明显
多核心一个观察者观察另一个核心的修改顺序的时候容易暴露问题
强弱内存模型:
强内存模型(×86):指令机架构,规定了很强的内存序,不需要额外添加一些指令去完成内存集的保证
弱内存(Arm、RISC-V):需要手动添加保证
dmb、dsb、lsb
部分信息可能已经过时











