Box<T>

在 Rust 中,Box<T> 是一种智能指针类型,专门用于将数据放到堆上进行动态分配。它主要用于以下几种场景: 类似C++中的unique_ptr指针。

  1. 在堆上分配数据:使用 Box,你可以在堆上存储大小固定的数据。对于非常大的结构体,可以避免在栈上占用过多空间。

  2. 实现递归数据结构:Rust 不允许在编译时确定大小的递归类型(例如树、链表),因此 Box 允许构建这些数据结构。

  3. 类型转换和特征对象:将结构体或类型转换为特征对象(例如 dyn Trait)。

基本用法

  1. 创建和解引用 Box

    fn main() {
        let x = 5;
        let boxed_x = Box::new(x); // 将整数 `5` 放在堆上
        println!("boxed_x: {}", *boxed_x); // 解引用
    }

    这里 Box::new(x) 将整数 5 分配在堆上,*boxed_x 解引用来获取数据。

  2. 递归数据结构 Box 对递归数据结构特别有用,比如链表:

    enum List {
        Node(i32, Box<List>),
        Nil,
    }
    
    fn main() {
        let list = List::Node(1, Box::new(List::Node(2, Box::new(List::Nil))));
    }

    使用 Box<List> 可以创建一个递归定义的链表结构。

  3. 动态分配和特征对象 Box 还可以用于存储实现特定特征的类型:

    trait Draw {
        fn draw(&self);
    }
    
    struct Circle;
    impl Draw for Circle {
        fn draw(&self) {
            println!("Drawing a circle");
        }
    }
    
    fn main() {
        let shape: Box<dyn Draw> = Box::new(Circle);
        shape.draw();
    }

    在这里,Box<dyn Draw>Circle 转换成一个特征对象 Draw,实现了多态性。

性能与内存管理

Box 的开销非常小,因为它只是存储了一个指针。它适合在需要堆上分配单个对象时使用,而无需复杂的引用计数或多线程控制。

Last updated