Vec
Vec
类似地,String 跟踪字节的内存区域,并以编程方式将写入其中的内容限制为始终有效的 utf-8,并帮助将该内存区域解引用为类型 &str。
这两种数据结构都使用不安全的解引用指针来完成它们的工作。
内存细节:
use std::alloc::{alloc, Layout}; |
Box 是一个可以让我们将数据从栈移动到堆的智能指针。
解引用可以让我们以人类更容易理解的方式使用堆分配的数据,就好像它是原始类型一样。
struct Pie; |
引用计数Rc
Rc 是一个能将数据从栈移动到智能指针。 它允许我们克隆其他Rc智能指针,这些指针都具有不可改变地借用放在堆上的数据的能力。
只有当最后一个智能指针被删除时,堆上的数据才会被释放。
use std::rc::Rc; |
共享访问RefCel
RefCell 是一个容器数据结构,通常由智能指针拥有,它接收数据并让我们借用可变或不可变引用来访问内部内容。 当您要求借用数据时,它通过在运行时强制执行 Rust 的内存安全规则来防止借用被滥用
只有一个可变引用或多个不可变引用,但不能同时有!
如果你违反了这些规则,RefCell 将会panic。
use std::cell::RefCell; |
线程间共享
Mutex 是一种容器数据结构,通常由智能指针持有,它接收数据并让我们借用对其中数据的可变和不可变引用。 这可以防止借用被滥用,因为操作系统一次只限制一个 CPU 线程访问数据,阻塞其他线程,直到原线程完成其锁定的借用。
多线程超出了 Rust 之旅的范围,但 Mutex 是协调多个 CPU 线程访问相同数据的基本部分。
有一个特殊的智能指针 Arc,它与 Rc 相同,除了使用线程安全的引用计数递增。 它通常用于对同一个 Mutex 进行多次引用。
组合智能指针
智能指针看起来可能会存在一些限制,但是我们可以做一些非常有用的结合。
Rc
Rc
Arc
内存细节:
use std::cell::RefCell; |
智能指针是 Rust编程中经常使用的,它可以让我们不必重新创建非常常见的内存使用范式。 有了它,您可以准备好应对最艰难的挑战了!