mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-01-13 13:50:37 +08:00
Refining Ch04.
This commit is contained in:
parent
377ccdf205
commit
de725f1230
@ -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` 失效后内存中的表示*
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user