Rust Box T用法

本文概述

  • 使用Box < T> 将数据存储在堆上。
  • 缺点清单
  • 使用Box < T> 来获取递归类型的大小
  • Box < T> 是一个智能指针, 它指向在类型T的堆上分配的数据。Box < T> 允许你将数据存储在堆而不是堆栈上。
  • Box < T> 是一个拥有的指针。
  • 除了将数据存储在堆上之外, 存储盒没有性能开销。
  • 当Box超出范围时, 将调用析构函数销毁所有内部对象并释放内存。
使用Box < T> 将数据存储在堆上。 Box < T> 主要用于在堆上存储数据。让我们通过一个简单的例子来理解这一点:
fn main(){let a = Box :: new(1); print!("value of a is : {}", a); }

输出
value of a is : 1

在上面的示例中, a包含Box的值, 该值指向数据1。如果我们访问Box的值, 则程序将输出” 1″ 。程序结束时, 将重新分配Box。该框存储在堆栈上, 它指向的数据存储在堆上。
让我们看一下上面例子的图示:
Rust Box T用法

文章图片
缺点清单
  • 缺点代表” 构造功能” 。
  • 缺点列表是一种数据结构, 用于根据两个参数构造一个新对, 该对称为列表。
  • 假设我们有两个元素x和y, 那么cons函数cons” x到y” 意味着我们通过将元素x首先放置, 然后是元素y来构造新容器。
  • 缺点列表包含两个元素, 即当前项目和最后一项。缺点列表的最后一项是Nil, 因为Nil不包含下一项。
现在, 我们创建包含cons列表的枚举。
enum List{cons(i32, List), Nil, }

在上面的代码中, 我们创建List类型的枚举, 其中包含i32值的cons列表数据结构。
现在, 在以下示例中使用上面的列表类型:
enum List {Cons(i32, List), Nil, }use List::{Cons, Nil}; fn main(){let list = List::Cons(1, Cons(2, Cons(3, Nil))); for i in list.iter(){print!("{}", i); }}

输出
Rust Box T用法

文章图片
在上面的示例中, Rust编译器抛出错误” 具有无限大小” , 因为List类型包含递归变量。结果, Rust无法找出需要多少空间来存储List值。通过使用Box < T> 可以解决无穷大的问题。
使用Box < T> 来获取递归类型的大小 Rust无法弄清楚存储递归数据类型需要多少空间。 Rust编译器在前一种情况下显示错误:
= help: insert indirection (e.g., a 'Box', 'Rc', or '& ') at some point to make 'List' representable

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

文章图片
让我们看一个简单的例子:
#[derive(Debug)] enum List {Cons(i32, Box< List> ), Nil, }use List::{Cons, Nil}; fn main(){let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))); print!("{:?}", list); }

【Rust Box T用法】输出
Cons(1, Cons(2, Cons(3, Nil)))

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

    推荐阅读