Update Ch15

This commit is contained in:
Unisko PENG 2023-05-10 17:16:23 +08:00
parent c4e4f71b3a
commit 66e54bd19d
3 changed files with 6 additions and 7 deletions

View File

@ -251,7 +251,7 @@ fn main() {
这段代码工作起来毫无问题,并显式地产生出图 4-3 中给出的行为,其间内存堆数据确实得以拷贝。
看到一个对 `clone` 方法的调用时,那么就明白正有一些任性代码在被执行,且那代码可能开销高昂。对此方法的调用,是某些不寻常事情正在发生的直观指示
咱们看到对 `clone` 的调用时,咱们就知道一些任意的代码正在被执行,而这些代码可能开销很大。这是表明正在发生一些不同寻常事情的明显标志
### 唯栈数据拷贝stack-only data: copy

View File

@ -696,14 +696,13 @@ error: could not compile `sp_demos` due to previous error;
{{#rustdoc_include ../projects/rc_demo/src/main.rs}}
```
*清单 15-18使用 `Rc<T>``List` 定义*
*清单 15-18使用 `Rc<T>``List` 定义*
由于 `Rc<T>` 不在 Rust 序曲中in the prelude因此就需要添加一条 `use` 语句将其带入到作用域中。在 `main` 函数里,这里创建了那个包含 `5``10` 的列表,并将其存储在 `a` 中的一个新 `Rc<List>` 里。随后在创建 `b``c` 时,这里调用了 `Rc::clone` 函数,并将到那个 `Rc<List>` 的引用作为参数加以传入
我们需要添加一个 `use` 语句来将 `Rc<T>` 引入作用域,因为他不在 Rust 前奏中。在 `main` 中,我们创建了包含 `5``10` 的列表,并将其存储在 `a` 中的新 `Rc<List>` 中。然后当我们创建 `b``c` 时,我们调用了 `Rc::clone` 函数,并将对 `a` 中的 `Rc<List>` 的引用作为参数传递
这里本可以调用 `a.clone()` 而不是 `Rc::clone(&a)`但在这种情况下Rust 的约定就是使用 `Rc::clone`。`Rc::clone` 方法的实现,与绝大多数类型的 `clone` 实现方式不同,其并不会构造全部数据的深拷贝。到 `Rc::clone` 的调用,只会增加引用计数,这样做不耗费很多时间。而数据的一些深拷贝,则能耗费很多时间。通过使用 `Rc::clone` 来进行引用计数,咱们就可以直观地区别出深拷贝类别的那些克隆,与那些增加引用计数的克隆类别。在查找代码中的性能问题时,咱们只需要关注那些深拷贝的克隆,而可以不用管那些到 `Rc::clone` 的调用。
> **注**:第 4 章 [变量与数据交互方式之二:克隆](Ch04_Understanding_Ownership.md#变量与数据交互方式之二克隆) 中,曾提到:“当看到一个对 clone 方法的调用时,那么就明白正有一些任性代码在被执行,且那代码可能开销高昂。对此方法的调用,是某些不同寻常事情正在发生的明显标志。”。
我们本可以调用 `a.clone()` 而不是 `Rc::clone(&a)`,但是 Rust 的惯例是在这种情况下使用 `Rc::clone`。`Rc::clone` 的实现并不像大多数类型的 `clone` 实现那样对所有数据进行深度拷贝。对 `Rc::clone` 的调用只是增加引用计数,这不会花费很多时间。数据的深度拷贝会花费很多时间。通过使用 `Rc::clone` 进行引用计数,我们可以直观地区分出深拷贝的那种克隆和增加引用计数的那种克隆。当寻找代码中的性能问题时,我们只需要考虑深拷贝的克隆,而可以不考虑对 `Rc::clone` 的调用。
> 注:第 4 章 [变量与数据交互方式之二:克隆](Ch04_Understanding_Ownership.md#变量与数据交互方式之二克隆) 中,曾提到:“当咱们看到对 `clone` 的调用时,咱们就知道一些任意的代码正在被执行,而这些代码可能开销很大。这是表明正在发生一些不同寻常事情的明显标志。”
### 对某个 `Rc<T>` 进行克隆,就会增加引用计数