Box指针

  1. Box允许将值放在堆上,留在栈上的则是指向堆数据的指针。Box唯一的损失是将数据
    存放在堆上
  2. box适合用于如下场景:
    1. 当有编译未知大小的类型,但是需要在确切的上下文中使用这个类型的时候;
      (举例 在一个list环境下存放数据,但是每个元素大小编译时不确定)
    2. 当有大量数据并且希望在确保数据不被拷贝的情况下转移所有权的时候;
    3. 当希望拥有一个值并且只关心这个值是否实现了特定的trait而不是具体的类型;

示例

1
2
3
4
fn main() {
let b = Box::new(5); //b在栈上,数据在堆上,b指向值为5这个内存地址
println!("b = {}",b);
}

Box的使用

场景:编译未知大小的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//报错:因为不知道确定的类型大小,List大小未知
enum List {
Cons(i32,List),
Nil,
}
//C语言中的定义
//struct 结构体的大小是已知的
//struct List {
// int value;
// struct List *next; //32位机器上4个字节的指针
// //struct List l; //递归
// }

fn main() {
use List::Cons;
use List::Nil;
let list = Cons(1,Const(2,Const(3,Nil)));
}
  • 使用Box不会报错

Box创建使用Box::new

1
2
3
4
5
6
7
8
9
enum List {
Cons(i,Box<List>),
Nil,
}
fn main() {
use List::*;
let list = Cons(1,Box::new(Cons(2,Box::new(Cons(3,Box::new(Nil))))));

}