以下三个声明之间有什么区别?我了解vec!宏的作用。那么,什么时候使用a和b声明?
let a = [1, 2, 3];
let b = &[1, 2, 3];
let c = vec![1, 2, 3];
Run Code Online (Sandbox Code Playgroud)
尽管这是基本信息,但您在开始阅读Rust文档或The Rust Book时应立即找到,但这里有一些简要说明:
let a = [1, 2, 3] 是3个元素的数组,它们完全位于堆栈中
stack:
+-----------+
| 1 | 2 | 3 |
+-----------+
Run Code Online (Sandbox Code Playgroud)
let b = &[1, 2, 3] 是对堆栈中3个元素的数组的引用:
stack:
+-----------+
| 1 | 2 | 3 |
+-----------+
^
+---+ |
pointer: | * |---|
+---+
Run Code Online (Sandbox Code Playgroud)
但是,如果将其更改为let b: &[u32] = &[1, 2, 3],b将不仅是对数组的引用,而是对切片的引用,因为Rust将执行Deref强制。切片是引用,它们还存储它们指向的内容的长度(这种引用称为fat-pointer):
stack:
+-----------+
| 1 | 2 | 3 |
+-----------+
^
+---+ |
pointer: | * |---|
+---+
length: | 3 |
+---+
Run Code Online (Sandbox Code Playgroud)
let c = vec![1, 2, 3] 是动态分配的向量,也就是说,它的数据将驻留在堆中,以便能够在运行时更改其大小,但是它将在堆栈中存储对堆数据的引用,向量的长度和容量:
stack: heap:
+---+ +-----------+---+
pointer: | * |---->| 1 | 2 | 3 |...|
+---+ +-----------+---+
length: | 3 |
+---+
capacity: | 4 |
+---+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |