Update chapter_3_7.md

This commit is contained in:
令狐一冲
2023-05-17 14:32:46 +08:00
committed by GitHub
parent 19d5c7fcb8
commit dadd62db72

View File

@@ -140,3 +140,36 @@ fn main() {
```
在第2行定义String类型时并不能确定最终字符串的大小所以字符串内容本身应该存储在堆上。结合什么String类型的本质的内容可以得到String类型的存储如下
![注释](../../assets/5.png)
String类型本身是三个字段指针、长度、容量在编译时是已知的大小存储在栈上String类型绑定的字符串在上面代码中是“AB”在编译时大小未知是运行时在堆上分配内存分配后的内存地址保存在String类型的指针字段中内存大小保存在cap字段中内存上存储的字符串长度保存在len字段中。
#### 4. move语义
Rust所有权规则第二条在任意时刻值有且仅有一个所有者。那么当一个变量赋给另外一个变量时发生了什么
- 完全存储在栈上的类型
考虑如下代码:
```Rust
fn main() {
let x = 5u32;
let y = x;
println!("x: {:?}, y: {:?}", x, y);
}
```
x和y都是u32类型在编译时知道大小都存储在栈上。代码第2行是将5绑定到变量x上第3行则是通过自动拷贝的方式将5绑定到y上先拷贝x的值5然后将拷贝后得到的5绑定到y上。所以当let y = x发生后这段代码里面最后有两个值5分别绑定到了x和y上。
- 涉及到堆存储的类型
再考虑如下代码:
```Rust
fn main() {
let s = "Hello world!".to_string();
let s1 = s;
// println!("s: {:?}", s); // 此行打开编译将报错
println!("s1: {:?}", s1);
}
```
s是String类型字符串“Hello world”是存储在堆内存上的其内存布局如下
![注释](../../assets/6.png)
当执行let s1 = s后内存布局如下
![注释](../../assets/7.png)