Rust Box<T>

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

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

在上面的示例中,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

下面來看一個簡單的例子 -

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