Rust 专题
您的位置:rust > Rust专题 > Rust Box<T>
Rust Box<T>
作者:--    发布时间:2019-11-20

box <t>是一个智能指针,指向在类型为t的堆上分配的数据。box <t>允许将数据存储在堆而不是堆栈上。
box <t>是一个拥有的指针。
除了将数据存储在堆上之外,box没有性能开销。
box离开作用域时,会调用析构函数来销毁所有内部对象并释放内存。

使用box <t>将数据存储在堆上。
主要是,box <t>用于在堆上存储数据。下面通过一个简单的例子来理解这一点:

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

执行上面示例代码,得到以下结果 -

value of a is : 1

在上面的例子中,a包含指向数据1box的值。如果访问box的值,则程序打印‘1’。 当程序结束时,box被解除分配。box存储在堆栈中,它指向的数据存储在堆上。

下面来看看上面例子的图解表示:

cons列表

  • cons代表“构造功能”。
  • cons列表是一个数据结构,用于从两个参数构造一个新对,这对称为list
  • 假设有两个元素xy,那么cons函数cons “x到y” 表示通过首先放置元素x,然后是元素y来构造新容器。
  • cons列表包含两个元素,即当前项和最后一项。 由于nil不包含下一个项目,因此缺点列表的最后一项是nil

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

enum list  
{  
   cons(i32, list),  
   nil,  
}

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

现在,在以下示例中使用上面的list类型:

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编译器抛出错误“具有无限大小”,因为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变量中。

下面来看一个简单的例子 -

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

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册