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存儲在堆疊中,它指向的數據存儲在堆上。

下麵來看看上面例子的圖解表示:

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

上一篇: Rust智能指針 下一篇: Rust Deref trait