Rust Box

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存储在堆栈中,它指向的数据存储在堆上。

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

《Rust Box<T>》” /></p><p><strong>Cons列表</strong></p><ul><li><code>Cons</code>代表“构造功能”。</li><li><code>Cons</code>列表是一个数据结构,用于从两个参数构造一个新对,这对称为<code>List</code>。</li><li>假设有两个元素<code>x</code>和<code>y</code>,那么<code>cons</code>函数<code>cons “x到y”</code> 表示通过首先放置元素<code>x</code>,然后是元素<code>y</code>来构造新容器。</li><li><code>Cons</code>列表包含两个元素,即当前项和最后一项。 由于<code>Nil</code>不包含下一个项目,因此缺点列表的最后一项是<code>Nil</code>。</li></ul><p>现在,创建包含<code>cons</code>列表的枚举。</p><pre><code>enum List  
{  
   cons(i32, List),  
   Nil,  
}
</code></pre><p>在上面的代码中,创建了<code>List</code>类型的枚举,其中包含<code>i32</code>值的<code>cons</code>列表数据结构。</p><p>现在,在以下示例中使用上面的<code>List</code>类型:</p><pre><code>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!(

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

《Rust Box<T>》” /></p><p>在上面的示例中,Rust编译器抛出错误“具有无限大小”,因为List类型包含递归的变体。 因此,Rust无法找出存储List值所需的空间。 使用<code>Box <T></code>可以克服无限大小的问题。</p><h2><span></span>使用<code>Box <T></code>获取递归类型的大小</h2><p>Rust无法确定存储递归数据类型需要多少空间。 Rust编译器在前一种情况下显示错误:</p><pre><code>= help: insert indirection (e.g., a 'Box', 'Rc', or '&') at some point to make 'List' representable
</code></pre><p>在上面的例子中,可以使用<code>Box <T></code>指针,因为编译器知道<code>Box <T></code>指针需要多少空间。 <code>Box <T></code>指针的大小在程序执行期间不会改变。 <code>Box <T></code>指针指向将存储在堆上而不是<code>cons</code>变量中的List值。 <code>Box <T></code>指针可以直接放在<code>cons</code>变量中。</p><p><img layer-src=

执行上面示例代码,得到以输出结果如下 –

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

        原文作者:Rust教程
        原文地址: https://www.yiibai.com/rust/rust-box-t.html
        本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
    点赞