Box<T>
與我們通常熟知的指針概念相同,是指向堆中數(shù)據(jù)的指針。Box<T>沿襲了Rust所有權(quán)機制:共享不可變双絮,可變不同享
弛矛,即够吩, 同時只能存在一個可變引用或者多個不可變引用。
Rc<T>
Rc<T> 主要用于同一堆上所分配的數(shù)據(jù)區(qū)域需要有多個只讀訪問的情況丈氓,多個訪問都對數(shù)據(jù)具有所有權(quán)
- Rc包裹的T是不可變的废恋,即不能修改T
- Rc只能用于單線程
- 由于要維護引用計數(shù),存在運行時消耗
Cell<T>
也是指向堆中數(shù)據(jù)的指針扒寄,但與Box<T>不同鱼鼓,Cell<T>允許修改T,同時该编,Cell<T>支持多個借用修改T迄本。
- 有一個限制條件是T必須是實現(xiàn)了
Copy
trait的類型 - Cell<T>只能用在單線程
RefCell<T>
RefCell<T>去掉了T必須實現(xiàn)Copy
trait的限制,不會在編譯器檢查课竣,但運行時依然要保證同時只能有一個可變借用嘉赎,否則線程崩潰。同時可以有多個不可變借用于樟。
組合使用
Rc<T>和RefCell<T>可以組合使用公条,場景:同時存在多個不同所有者,每個所有者又可以隨時修改其內(nèi)容迂曲。