diff --git a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md index 13a65dd..2352c53 100644 --- a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md +++ b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md @@ -347,7 +347,7 @@ enum Result { `Result` 枚举对 `T` 和 `E` 两种类型通用,并有着两个变种:保存了一个类型 `T` 值的 `Ok`,与保存了一个类型 `E` 值的 `Err`。这个定义使得在某个操作可能成功(便返回某种类型 `T` 的一个值),或失败(便返回一个某种类型 `E` 的值)的地方,使用 `Result` 枚举方便起来。事实上,这正是咱们在清单 9-3 中,打开某个文件时所用到的,在文件被成功打开时,其中的 `T` 就以 `std::fs::File` 给填上了,而当打开那个文件时,若存在某些问题,那么其中的 `E` 就会被 `std::io::Error` 填充。 -当咱们认识到咱们的代码中,有着仅在其所保存值类型上有区别的多个结构体或枚举的情况时,咱们就可以通过使用泛型避免代码重复。 +当咱们认识到咱们的代码中,有着仅在其所保存值类型方面有区别的多个结构体或枚举的情况时,咱们就可以通过使用泛型避免代码重复。 ### 在方法定义中 @@ -443,9 +443,9 @@ fn main() { ### 使用泛型参数代码的性能问题 -咱们或许想知道,在运用了泛型参数时,是否有着运行时的开销。好消息就是,相比于使用具体类型,使用泛型并不会令到程序运行得更慢。 +咱们或许想知道,在运用了泛型参数时,是否有着运行时的开销。好消息就是,相比于使用具体类型,使用泛型不会令到咱们的程序运行得更慢。 -Rust 通过在编译时,完成那些使用了泛型代码的单态化(performing monomorphization of the code using generics),实现了这一点。所谓 *单态化(monomorphization)*,即通过将在编译后用到的具体类型填入进去,而将通用代码转换为具体代码的过程。在此过程中,编译器会执行与清单 10-5 中曾创建通用函数相反的步骤:编译器会查看所有泛型代码被调用到的地方,并生成调用到泛型代码的那些具体类型的代码。 +Rust 通过在编译时,完成那些使用了泛型代码的单态化,performing monomorphization of the code using generics,达成这个目的。所谓 *单态化,monomorphization*,是指即通过把在编译后用到的具体类型填入到泛型位置,而将通用代码转换为具体代码的过程。在此过程中,编译器会执行与清单 10-5 中曾创建通用函数相反的步骤:编译器会查看所有泛型代码被调用到的地方,并生成调用到泛型代码的那些具体类型的代码。 下面就来通过使用标准库的通用 `Option` 枚举,看看单态化的工作原理: diff --git a/src/Ch21_Appendix.md b/src/Ch21_Appendix.md index adafe6b..06f93e5 100644 --- a/src/Ch21_Appendix.md +++ b/src/Ch21_Appendix.md @@ -741,4 +741,51 @@ $ rustup override set nightly 过了一段时间后,一旦那些用到每日发布的 Rust 开发者们,能够试用这项新特性,那么 Rust 团队成员将讨论这项特性,怎样将其编制到每日发布上,并决定其是否有那个被构造到稳定发布 Rust。而若决定是继续推进,那么特性门就会被移除,同时这项特性就被认为是稳定的了!他就会搭上列车,进到一个新的稳定发布 Rust 中。 -<全书完> +## 附录 H - 术语清单 + +### 单态化,monomorphization + +所谓 *单态化,monomorphization*,是指即通过把在编译后用到的具体类型填入到泛型位置,而将通用代码转换为具体代码的过程。参考 [使用泛型代码的性能问题](Ch10_Generic_Types_Traits_and_Lifetimes.md#使用泛型参数代码的性能问题)。 + + +## 附录 I - 有用笔记 + +此处记录学习及应用 Rust 编程软件过程中,觉得有用的一些东西。 + + +## `cargo-binutils` + +[这个项目](https://github.com/rust-embedded/cargo-binutils) 是 Embbeded-Rust 项目的,而不是 Rust 官方的,但提供了有用的功能。比如查看构建出的二进制程序文件的那些头部: + + +```console +$ cargo readobj --bin clippy_demo -- --file-headers + Finished dev [unoptimized + debuginfo] target(s) in 0.00s +ELF Header: + Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF64 + Data: 2's complement, little endian + Version: 1 (current) + OS/ABI: UNIX - System V + ABI Version: 0 + Type: DYN (Shared object file) + Machine: Advanced Micro Devices X86-64 + Version: 0x1 + Entry point address: 0x86D0 + Start of program headers: 64 (bytes into file) + Start of section headers: 4305200 (bytes into file) + Flags: 0x0 + Size of this header: 64 (bytes) + Size of program headers: 56 (bytes) + Number of program headers: 12 + Size of section headers: 64 (bytes) + Number of section headers: 42 + Section header string table index: 41 +``` + +使用前需要进行如下安装: + +```console +$ cargo install cargo-binutils +$ rustup component add llvm-tools-preview +``` diff --git a/src/Ch22_Useful_Tips.md b/src/Ch22_Useful_Tips.md deleted file mode 100644 index 6129f52..0000000 --- a/src/Ch22_Useful_Tips.md +++ /dev/null @@ -1,41 +0,0 @@ -# 有用笔记 - -此处记录学习及应用 Rust 编程软件过程中,觉得有用的一些东西。 - - -## `cargo-binutils` - -[这个项目](https://github.com/rust-embedded/cargo-binutils) 是 Embbeded-Rust 项目的,而不是 Rust 官方的,但提供了有用的功能。比如查看构建出的二进制程序文件的那些头部: - - -```console -$ cargo readobj --bin clippy_demo -- --file-headers - Finished dev [unoptimized + debuginfo] target(s) in 0.00s -ELF Header: - Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 - Class: ELF64 - Data: 2's complement, little endian - Version: 1 (current) - OS/ABI: UNIX - System V - ABI Version: 0 - Type: DYN (Shared object file) - Machine: Advanced Micro Devices X86-64 - Version: 0x1 - Entry point address: 0x86D0 - Start of program headers: 64 (bytes into file) - Start of section headers: 4305200 (bytes into file) - Flags: 0x0 - Size of this header: 64 (bytes) - Size of program headers: 56 (bytes) - Number of program headers: 12 - Size of section headers: 64 (bytes) - Number of section headers: 42 - Section header string table index: 41 -``` - -使用前需要进行如下安装: - -```console -$ cargo install cargo-binutils -$ rustup component add llvm-tools-preview -``` diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 2e4c026..5037446 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -62,5 +62,3 @@ - [最后项目:构建一个多线程的 Web 服务器](Ch20_Final_Project_Building_a_Multithreaded_Web_Server.md) - [附录](Ch21_Appendix.md) - -- [一些有用的 Tips](Ch22_Useful_Tips.md)