以下三个声明之间有什么区别?我了解vec!
宏的作用。那么,什么时候使用a
和b
声明?
let a = [1, 2, 3];
let b = &[1, 2, 3];
let c = vec![1, 2, 3];
答案 0 :(得分:7)
尽管这是基本信息,但您在开始阅读Rust文档或Rust Book时应立即找到,这里有一些简单的说明:
let a = [1, 2, 3]
是3个元素的数组,完全位于堆栈中
stack:
+-----------+
| 1 | 2 | 3 |
+-----------+
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 |
+---+
let c = vec![1, 2, 3]
是动态分配的向量,也就是说,其数据将驻留在堆中,以便能够在运行时更改其大小,但是它将在堆栈中存储对堆数据的引用,向量的长度和容量:
stack: heap:
+---+ +-----------+---+
pointer: | * |---->| 1 | 2 | 3 |...|
+---+ +-----------+---+
length: | 3 |
+---+
capacity: | 4 |
+---+