目前rust学习已经持续很长时间了。但是,最近在学习嵌入式rust后,越来越来习惯使用裸指针的代码了。这是个不好的习惯。为此,今天特意将rust标准库中的常见智能指针进行一下总结。
偏上层应用的智能指针
智能指针 | 说明 | Sync 版本 |
---|---|---|
Cell<T> |
内部可变性,一般要求T:Copy |
|
RefCell<T> |
内部可变性,一般不要求T:Copy |
RwLock<T> |
OnceCell<T> |
只能设置(变更)一次的内部可变性 | OnceLock<T> |
LazyCell<T, F> |
延迟初始化 | LazyLock<T,F> |
Box<T> |
将值分配到堆上 | |
Vec<T> |
动态数组 | |
Rc<T> |
引用计数实现的多所有者 | Arc<T> |
Cow<'a, B> |
写时复制 |
偏底层的智能指针(如无特殊说明,下列指针都不会执行T
的drop
)
智能指针 | 说明 | Sync 版本 |
---|---|---|
UnsafeCell<T> |
内部可变性的基础,可以对外提供*mut T ,会执行drop |
|
ManuallyDrop<T> |
禁止编译器自动调用T 的drop |
|
MaybeUninit<T> |
可能没有初始化的空间 | |
NonNull<T> |
非0指针且协变的*mut T |
Cell<T>
和RefCell<T>
Cell<T>
是毫无任何的运行时消耗,是通过交换内外的值实现内部可变性。主要针对简单类型。
RefCell<T>
是存在运行时检查借用规则的消耗,是通过提供内部值的可变引用实现的内部可变性。