Box<T>

2025年3月17日 | 阅读 3 分钟
  • Box<T> 是一个智能指针,指向分配在堆上的 T 类型数据。 Box<T> 允许您将数据存储在堆上而不是栈上。
  • Box<T> 是一个拥有的指针。
  • 除了将数据存储在堆上之外,Box 没有任何性能开销。
  • 当 Box 超出范围时,将调用析构函数来销毁所有内部对象并释放内存。

使用 Box<T> 将数据存储在堆上。

主要,Box<T> 用于将数据存储在堆上。 让我们通过一个简单的例子来理解这一点:

输出

value of a is : 1

在上面的例子中,a 包含指向数据 1 的 Box 的值。如果我们访问 Box 的值,则程序打印“1”。当程序结束时,Box 被释放。 box 存储在栈上,而它所指向的数据存储在堆上。

让我们看看上面例子的图示

Rust Box

Cons 列表

  • Cons 代表 “构造函数”
  • Cons 列表是一种数据结构,用于从两个参数构造一个新的对,这个对被称为 List。
  • 假设我们有两个元素 x 和 y,那么 cons 函数将“x 放到 y 上”表示我们通过先放置元素 x,然后是元素 y 来构造新的容器。
  • Cons 列表包含两个元素,即当前项和最后一项。 cons 列表的最后一项是 Nil,因为 Nil 不包含下一项。

现在,我们创建包含 cons 列表的枚举。

在上面的代码中,我们创建了 List 类型的枚举,它包含 i32 值的 cons 列表数据结构。

现在,我们在下面的例子中使用上面的 List 类型

输出

Rust Box

在上面的例子中,Rust 编译器抛出一个错误“具有无限大小”,因为 List 类型包含一个递归变体。结果,Rust 无法找出需要多少空间来存储 List 值。可以使用 Box<T> 来克服无限大小的问题。

使用 Box<T> 获取递归类型的大小

Rust 无法确定存储递归数据类型需要多少空间。 Rust 编译器在前面的情况下显示错误

在上面的情况下,我们可以使用 Box<T> 指针,因为编译器知道 Box<T> 指针需要多少空间。 Box<T> 指针的大小在程序执行期间不会改变。 Box<T> 指针指向将存储在堆上而不是 cons 变体中的 List 值。 Box<T> 指针可以直接放置在 cons 变体中。


Rust Box

让我们看一个简单的例子

输出

Cons(1, Cons(2, Cons(3, Nil)))

注意:如果我们在递归数据类型中使用 Box<T> 指针,那么 List 值的大小将等于 i32 值的大小加上 box 指针的数据的大小?


下一个主题Deref 特征