跳转至

所有权

三原则#

  1. 每个值(资源)都有一个所有者(变量),并非所有变量都拥有资源(例如引用)

  2. 值在任意时刻只有一个所有者

  3. 所有者离开作用域,值将被丢弃(除非值被转移给另一个变量)

Move语义与Copy语义#

  1. 赋值或传参会导致值Move,所有权转移

  2. 如果值实现了Copy trait,那么赋值或传参会使用Copy语义,按位拷贝

  3. 原生类型默认实现了copy trait,如函数、不可变引用和裸指针,数组和元组,换句话说,存在栈上的数据

借用(引用)#

  1. 值可以多个只读引用,只读引用默认实现了Copy语义

  2. 任意时刻只能有一个活跃的可变引用,可变引用和只读引用是互斥的关系

  3. 引用的生命周期不能超出值的生命周期

共享所有权#

访问方式 数据 不可变借用 可变借用
单一所有权(外部可见性) 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

评论

Back to top