Rust - Box|Rc|Arc|Cell|RefCell|Cow

一、Box<T> 是一种独享所有权智能指针,类似C++的unique_ptr

资源分配在堆上,依靠DerefDrop来管理堆上的资源,零运行时开销,是最常用的套娃。

  • 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

资源分配在堆上,依靠DerefDrop来管理堆上的资源,使用引用计数算法。

  • 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

资源分配在堆上,依靠DerefDrop来管理堆上的资源,使用引用计数算法。

  • 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会把自己返回。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章