所有权
三原则#
-
每个值(资源)都有一个所有者(变量),并非所有变量都拥有资源(例如引用)
-
值在任意时刻只有一个所有者
-
所有者离开作用域,值将被丢弃(除非值被转移给另一个变量)
Move语义与Copy语义#
-
赋值或传参会导致值Move,所有权转移
-
如果值实现了Copy trait,那么赋值或传参会使用Copy语义,按位拷贝
-
原生类型默认实现了copy trait,如函数、不可变引用和裸指针,数组和元组,换句话说,存在栈上的数据
借用(引用)#
-
值可以多个只读引用,只读引用默认实现了Copy语义
-
任意时刻只能有一个活跃的可变引用,可变引用和只读引用是互斥的关系
-
引用的生命周期不能超出值的生命周期
共享所有权#
访问方式 | 数据 | 不可变借用 | 可变借用 | |
---|---|---|---|---|
单一所有权(外部可见性) | T | &T | &mut T | |
共享所有权(内部可见性) | 单线程 | Rc\<T> | &Rc\<T> | 无法得到 |
单线程 | Rc\<RefCell\<T>> | v.borrow() | v.borrow_mut() | |
共享所有权(内部可见性) | 多线程 | Arc\<T> | &Arc\<T> | 无法得到 |
多线程 | Arc\<Mutex\<T>> | v.lock() | v.lock() | |
多线程 | Arc\<RwLock\<T>> | v.read() | v.borrow() |
Rc 比 Arc性能效率高, 外部可见性应对编译期检查;内部可见性应对运行时检查,检查不过会panic