Rust - Box<T>

Rust - Box<T> 首页 / Rust入门教程 / Rust - Box<T>
  • Box <T>是一个智能指针,它指向在类型T的堆上分配的数据。Box <T>允许您将数据存储在堆而不是堆栈上。
  • Box <T>是一个拥有的指针。
  • 当Box超出范围时,将调用析构函数销毁所有内部对象并释放内存。

数据存储在堆上

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

 fn main()
{
  let a = Box ::new(1);
  print!("value of a is : {}",a);
} 

输出:

value of a is : 1

在上面的示例中,a包含指向数据1的Box的值。如果我们访问Box的值,则程序将输出"1"。程序结束时,将重新分配Box。该框存储在堆栈上,它指向的数据存储在堆上。

让我们看看上面的示例的图形表示:

Rust Box

Cons列表

现在,我们创建包含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

在上面的示例中,Rust编译器抛出错误“has infinite size",因为List类型包含递归变量。结果,Rust无法找出需要多少空间来存储List值。通过使用Box <T>可以解决无穷大的问题。

获取递归大小

Rust无法弄清楚存储递归数据类型需要多少空间。 Rust编译器在前一种情况下显示错误:

链接:https://www.learnfk.comhttps://www.learnfk.com/rust/rust-box-t.html

来源:LearnFk无涯教程网

= 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

让我们看看一个简单的例子:

 #[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);
  
}

输出:

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

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

快速上手Kotlin开发 -〔张涛〕

从0开始学微服务 -〔胡忠想〕

重学前端 -〔程劭非(winter)〕

Redis核心技术与实战 -〔蒋德钧〕

性能优化高手课 -〔尉刚强〕

如何成为学习高手 -〔高冷冷〕

玩转Vue 3全家桶 -〔大圣〕

云计算的必修小课 -〔吕蕴偲〕

结构思考力 · 透过结构看思考 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)