Refining Ch04.

This commit is contained in:
Peng Hailin, 2023-12-12 21:52:09 +08:00
parent 377ccdf205
commit de725f1230

View File

@ -206,7 +206,7 @@ fn main() {
请看图 4-1了解 `String` 的到底发生了什么。一个 `String` 由三部分组成(如左图所示):指向存放该字符串内容的内存的一个指针、一个长度与一个容量。这组数据,是存储在栈上的。而图的右边,则是堆上存放着内容的内存。
![Rust 中 `String` 类型的本质](images/Ch04_01.svg)
![Rust 中 `String` 类型的本质](../images/Ch04_01.svg)
*图 4-1保存绑定到 `s1` 的值 `"hello"``String` 在内存中的表示*
@ -218,14 +218,14 @@ fn main() {
当我们把 `s1` 赋值给 `s2` 时,这个 `String` 数据会被复制,这意味着我们拷贝了栈上的指针、长度和容量。我们不会拷贝该指针所指向的堆上数据。换句话说,内存中的数据表示,会如下图 4-2 所示。
![有着变量 `s1` 的指针、长度与容量拷贝的变量 `s2` 在内存中的表示](images/Ch04_02.svg)
![有着变量 `s1` 的指针、长度与容量拷贝的变量 `s2` 在内存中的表示](../images/Ch04_02.svg)
*图 4-2变量 `s2` 在内存中的表示,其有着 `s1` 的指针、长度和容量的副本*
如果 Rust 也拷贝了堆数据,那么内存的表示就不会如图 4-3 所示。如果 Rust 这样做了,那么在堆上的数据很大时,操作 `s2 = s1` 在运行时的性能方面,可能会非常昂贵。
![`s2 = s1` 操作的另一种可能Rust 拷贝内存堆数据](images/Ch04_03.svg)
![`s2 = s1` 操作的另一种可能Rust 拷贝内存堆数据](../images/Ch04_03.svg)
*图 4-3如果 Rust 也复制了堆数据,则 `s2 = s1` 可能会执行的另一种可能性*
@ -281,7 +281,7 @@ error: could not compile `ownership_demo` (bin "ownership_demo") due to previous
若在使用其他编程语言时,曾听说过 *浅拷贝shallow copy**深拷贝deep copy* 这两个说法,那么这种对指针、长度与容量的拷贝,而未拷贝数据的概念,或许听起来像是进行了一次浅拷贝。但由于 Rust 还将第一个变量进行了失效处理,因此这里就不叫浅拷贝,而叫做 *迁移move*。在这个示例中,就会讲,变量 `s1` 已被 *迁移* 到变量 `s2` 里了。因此真实发生的事情,就是下图 4-4 显示的那样:
![在变量 `s1` 失效后内存中的表示](images/Ch04_04.svg)
![在变量 `s1` 失效后内存中的表示](../images/Ch04_04.svg)
*图 4-4在变量 `s1` 失效后内存中的表示*