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