一、Box<T>
是一种独享所有权智能指针,类似C++的unique_ptr
资源分配在堆上,依靠
Deref
和Drop
来管理堆上的资源,零运行时开销,是最常用的套娃。
- Box::new(v) : 创建,移动语义,独占所有权 -
move
,允许
使用*
转移本体所有权 - 不可变借用:Box::borrow()、Box::as_ref()、Box::deref()
- 可变借用:Box::borrow_mut()、Box::as_mut()、Box::deref_mut()
二、Rc<T>
是一种共享所有权智能指针,类似C++的shared_ptr
资源分配在堆上,依靠
Deref
和Drop
来管理堆上的资源,使用引用计数算法。
- Rc::new(v) : 创建,移动语义,共享所有权 -
clone
,禁止
使用*
转移本体所有权 - 不可变借用:Rc::borrow()、Rc::as_ref()、Rc::deref()
- 可变借用:Rc::borrow_mut()、Rc::as_mut()、Rc::deref_mut()
三、Arc<T>
是一种线程安全的共享所有权智能指针,类似C++的shared_ptr + mutex
资源分配在堆上,依靠
Deref
和Drop
来管理堆上的资源,使用引用计数算法。
- Arc::new(v) : 创建,移动语义,共享所有权 -
clone
,禁止
使用*
转移本体所有权 - 不可变借用:Arc::borrow()、Arc::as_ref()、Arc::deref()
- 可变借用:Arc::borrow_mut()、Arc::as_mut()、Arc::deref_mut()
四、Cell<T>
是一种提供内部可变性
的容器,类似智能手机电池,看似不可换,打开盖子后是可以换的
适合实现了Copy的类型,或者体积小的struct,因为get方法是直接按位复制的。
无运行时开销,运行时安全。
- Cell::new(v) : 创建,移动语义
- 获取本体v:Cell::get()
- 获取本体借用&v:Cell::get_mut()
- 修改本体v:Cell::set(vv)
四、RefCell<T>
是一种提供内部可变性
的容器,类似智能手机电池,看似不可换,打开盖子后是可以换的
适合未实现了Copy的类型,或者体积大的struct,Cell不好使的都是用这个。
运行时有开销,会执行借用检查,运行时不安全。
- RefCell::new(v) : 创建,移动语义
- 不可变借用:RefCell::borrow()、类似Cell::get
- 可变借用:RefCell::borrow_mut()、类似Cell::set
五、Cow<T>
是一种写时复制
的枚举体的智能指针,类似扫地僧,实际是武林高手
目的是减少复制操作,提高性能,多用于读多写少的场景
- Cow::Borrowed(v) | Cow::Owned(v) : 创建,移动语义
- 不可变借用:Cow::deref(),Owned会调用borrow返回,Borrowed直接返回
- 可变借用:Cow::to_mut(),Borrowed会调用clone替换自己为Owned,然后Owned会匹配ref mut释放借用。
- 获得本体:Cow::into_owned(),Borrowed会调用clone后返回,Owned会把自己返回。