美文网首页
Rust基础之理解Box

Rust基础之理解Box

作者: oO白眉大虾Oo | 来源:发表于2022-04-12 23:15 被阅读0次

Box<T>的适用场景:

  1. 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候
  2. 当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候
  3. 当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候

当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候

在编译时无法知道其大小的类型是递归类型(recursive type), 也即是嵌套类型, 比如链表这种数据结构

官方示例:递归类型拥有无限大小

use crate::List::{Cons, Nil};

enum List {
    Cons(i32, List),
    Nil,
}

fn main() {
    let list = Cons(1, Cons(2, Cons(3, Nil)));
}
// 编译报错:
// recursive type `List` has infinite size

那Rust是怎么计算大小的?

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

Rust 会遍历 Message 每个成员以查看 Message 哪个成员需要最多空间。
成员ChangeColor需要3个i32的空间

所以回到刚才的例子,Cons的大小根本无法推算出来;

图片.png

而 Box<T> 是一个指针,指针的大小不会根据它指向的数据量而改变。
这意味着可以将 Box 放入 Cons 成员中而不是直接存放另一个 List 值.

enum List {
    Cons(i32, Box<List>),
    Nil,
}

use crate::List::{Cons, Nil};

fn main() {
    let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));
}
图片.png

box 只提供了间接存储和堆分配;他们并没有任何其他特殊的功能

当有大量数据并希望在确保数据不被拷贝的情况下转移所有权的时候 [未验证]

转移大量数据的所有权可能需要很长时间,因为数据是在堆栈上复制的。
为了在这种情况下提高性能,我们可以将堆上的大量数据存储在一个盒子中;

当希望拥有一个值并只关心它的类型是否实现了特定 trait 而不是其具体类型的时候

pub trait Draw {
    fn draw(&self);
}

pub struct Screen {
    pub components: Vec<Box<dyn Draw>>,
}

dyn关键字用于强调相关trait的方法是动态分配的
所以编译过程中是不知道具体大小的,需要用Box来修饰

相关文章

  • Rust基础之理解Box

    Box的适用场景: 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候 当...

  • [Rust]指针

    Box 与我们通常熟知的指针概念相同,是指向堆中数据的指针。Box沿袭了Rust所有权机制:共享不可变...

  • Rust标准库

    [TOC] Rust标准库 Rust中的智能指针Box Box 允许将一个值放在堆上而不是栈上,留在栈上的则是指向...

  • rust中的智能指针Box

    rust中的指针大致可以分成三种:引用、裸指针和智能指针。 智能指针实际上是一种结构体,只不过它的行为类似指针。智...

  • 2022-07-23

    Rust Box堆分配Box 背后是调用 jemalloc 来做内存管理,所以堆上的空间无需我们的手动管理。与此类...

  • Struts2——Action动态方法调用

    rust Iterator

    Rust Iterator设计: 定义: 对Iterator Trait的理解: Rust的Iterator在大部...

  • Rust语言编程实例100题-049

    Rust语言编程实例100题-049 题目:在Rust中不像Java那样,存在null值。Option是定义...

  • 【RUST_BASIC】Rust 智能指针

    1 Box 最简单直接的智能指针是 box,其类型是 Box,其允许将一个值放在堆上,留在栈上的则是指...

  • 最常用的15大Eclipse开发快捷键技巧

    引言

    网友评论