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
包含指向數據1
的Box
的值。如果訪問Box
的值,則程式列印‘1’。 當程式結束時,Box
被解除分配。Box
存儲在堆疊中,它指向的數據存儲在堆上。
下麵來看看上面例子的圖解表示:
Cons列表
Cons
代表“構造功能”。Cons
列表是一個數據結構,用於從兩個參數構造一個新對,這對稱為List
。- 假設有兩個元素
x
和y
,那麼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