1 - Rust标准库中的Boxed介绍
Rust标准库中的Boxed介绍
https://doc.rust-lang.org/std/boxed/index.html
用于堆分配的指针类型。
Box
例子
通过创建Box,将值从栈中移动到堆中:
let val: u8 = 5;
let boxed: Box<u8> = Box::new(val);
通过取消引用(dereferencing)将值从Box中移回栈中:
let boxed: Box<u8> = Box::new(5);
let val: u8 = *boxed;
创建一个递归数据结构:
#[derive(Debug)]
enum List<T> {
Cons(T, Box<List<T>>),
Nil,
}
let list: List<i32> = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil))));
println!("{:?}", list);
这将打印出 Cons(1, Cons(2, Nil))
。
递归结构必须是box,因为如果Cons的定义是这样的:
Cons(T, List<T>),
这样做就不行了。这是因为List的大小取决于列表中有多少元素,所以我们不知道要为Cons分配多少内存。通过引入一个Box
内存布局
TODO