Box<T>
与我们通常熟知的指针概念相同,是指向堆中数据的指针。Box<T>沿袭了Rust所有权机制:共享不可变,可变不同享
,即, 同时只能存在一个可变引用或者多个不可变引用。
Rc<T>
Rc<T> 主要用于同一堆上所分配的数据区域需要有多个只读访问的情况,多个访问都对数据具有所有权
- Rc包裹的T是不可变的,即不能修改T
- Rc只能用于单线程
- 由于要维护引用计数,存在运行时消耗
Cell<T>
也是指向堆中数据的指针,但与Box<T>不同,Cell<T>允许修改T,同时,Cell<T>支持多个借用修改T。
- 有一个限制条件是T必须是实现了
Copy
trait的类型 - Cell<T>只能用在单线程
RefCell<T>
RefCell<T>去掉了T必须实现Copy
trait的限制,不会在编译器检查,但运行时依然要保证同时只能有一个可变借用,否则线程崩溃。同时可以有多个不可变借用。
组合使用
Rc<T>和RefCell<T>可以组合使用,场景:同时存在多个不同所有者,每个所有者又可以随时修改其内容。
网友评论