{],&[]和vec![]声明之间有什么区别?

时间:2019-09-09 05:03:19

标签: rust

以下三个声明之间有什么区别?我了解vec!宏的作用。那么,什么时候使用ab声明?

let a = [1, 2, 3];
let b = &[1, 2, 3];
let c = vec![1, 2, 3];

1 个答案:

答案 0 :(得分:7)

尽管这是基本信息,但您在开始阅读Rust文档或Rust Book时应立即找到,这里有一些简单的说明:

  1. Array

let a = [1, 2, 3]是3个元素的数组,完全位于堆栈中

stack:

+-----------+
| 1 | 2 | 3 |
+-----------+

  1. Slice

let b = &[1, 2, 3]是对堆栈中3个元素的数组的引用:

         stack:
                 +-----------+
                 | 1 | 2 | 3 |
                 +-----------+
                 ^
         +---+   |
pointer: | * |---|
         +---+

但是,如果将其更改为let b: &[u32] = &[1, 2, 3],则b不仅是对数组的引用,而且将是 slice ,因为Rust将执行{{3} }。切片是引用,它们还存储它们指向的对象的长度(这种引用称为 fat-pointers ):

         stack:
                 +-----------+
                 | 1 | 2 | 3 |
                 +-----------+
                 ^
         +---+   |
pointer: | * |---|
         +---+
length:  | 3 |
         +---+
  1. Deref coercion

let c = vec![1, 2, 3]是动态分配的向量,也就是说,其数据将驻留在堆中,以便能够在运行时更改其大小,但是它将在堆栈中存储对堆数据的引用,向量的长度和容量:

            stack:       heap:
            +---+     +-----------+---+
pointer:    | * |---->| 1 | 2 | 3 |...|
            +---+     +-----------+---+
length:     | 3 |
            +---+
capacity:   | 4 |
            +---+