一、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會把自己返回。