Pointer

祼指针 *const T/*mut T

基本等价于 C/C++ 中的普通指针,编译器只能对它进行最基本的skyp性检查(读写检查)

引用 &T/&mut T

本质上是地址范围,编译器会在编译时进行比较严格的借用检查

智能指针

不仅包含指向的地址范围,还包含额外的信息,属于胖指针

Box<T>

在创建时会在堆上分配一个类型为 T的变量,它自身也只保存在堆上的那个变量的位置。而和裸指针或引用不同的是,当 Box<T>被回收的时候,它指向的那个变量(位于堆上)也会被回收。Box<T>可以对标 C++ 的 std::unique_ptr

Rc<T> 

一个单线程上使用的引用计数类型,即可同时存在多个智能指针指向同一个堆上变量的 Rc<T> ,它们都可以拿到指向变量的不可变引用来访问这同一个变量。而它同时也是一个引用计数,事实上在堆上的另一个位置维护了这个变量目前被引用的次数 N ,即存在 N 个 Rc<T> 智能指针。这个计数会随着 Rc<T> 智能指针的创建或复制而增加,并在 Rc<T> 智能指针生命周期结束时减少。当这个计数变为零之后,这个智能指针变量本身以及被引用的变量都会被回收。
 Arc<T> 与 Rc<T> 功能相同,只是Arc<T> 可以在多线程上使用。 Arc<T> 类似于 C++ 的 std::shared_ptr 。

RefCell<T> 

其 借用检查 在运行时进行。对于 RefCell<T>,如果违反借用规则,程序会编译通过,但会在运行时 panic 并退出。使用 RefCell<T> 的好处是,可在其自身是不可变的情况下修改其内部的值。在Rust语言中,在不可变值内部改变值是一种 内部可变性 的设计模式。

Mutex<T>

互斥锁,在多线程中使用。它可以保护里层的堆上的变量同一时间只有一个线程能对它进行操作,从而避免数据竞争。
通常组合使用 Arc<Mutex<T>>,让T可以在线程间安全传递。
notion image
 

Ref