From d998bffc7964c9982dbcf78955fc986aaf4f618e Mon Sep 17 00:00:00 2001 From: sunface Date: Fri, 25 Feb 2022 17:11:29 +0800 Subject: [PATCH] add a example to ownership.md --- contents/appendix/rust-versions/1.59.md | 14 ++++++++++++++ contents/basic/ownership/ownership.md | 17 ++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/contents/appendix/rust-versions/1.59.md b/contents/appendix/rust-versions/1.59.md index 14350428..c0274f4f 100644 --- a/contents/appendix/rust-versions/1.59.md +++ b/contents/appendix/rust-versions/1.59.md @@ -92,6 +92,20 @@ strip = "debuginfo" 以上配置会将 `release` 二进制文件中的 debug 信息移除。你也可以使用 `"symbols"` 或 `true` 选项来移除所有支持的 `symbol` 信息。 +根据 reddit 网友的测试,如果使用了 `strip = true`,那编译后的体积将大幅减少(50% 左右): + +- 先使用 `lto = true` : 4,397,320 bytes +- 再使用 `strip = true` : 2,657,304 bytes +- 最后 `opt-level = "z"` : 1,857,680 bytes + +如果是 WASM,还可以使用以下配置进一步减少体积: +```toml +[package.metadata.wasm-pack.profile.release] +wasm-opt = ['-Os'] +``` + +[github上一个开源仓库](https://github.com/rsadsb/adsb_deku/blob/master/CHANGELOG.md#unreleased)也证明了这一点,总体来看,这个配置的效果是非常显著的! + ## 默认关闭增量编译 1.59.0 版本默认关闭了增量编译的功能(你可以通过环境变量显式地启用:`RUSTC_FORCE_INCREMENTAL=1` ),这会降低已知bug [#94124](https://github.com/rust-lang/rust/issues/94124) 的影响,该 bug 会导致增量编译过程中的反序列化的误和 panic。 diff --git a/contents/basic/ownership/ownership.md b/contents/basic/ownership/ownership.md index 8c6ec16f..b13c5215 100644 --- a/contents/basic/ownership/ownership.md +++ b/contents/basic/ownership/ownership.md @@ -198,6 +198,21 @@ error[E0382]: use of moved value: `s1` 这样就解决了我们之前的问题,`s1` 不再指向任何数据,只有 `s2` 是有效的,当 `s2` 离开作用域,它就会释放内存。 相信此刻,你应该明白了,为什么 Rust 称呼 `let a = b` 为**变量绑定**了吧? +再来看一段代码: +```rust +fn main() { + let x: &str = "hello, world"; + let y = x; + println!("{},{}",x,y); +} +``` + +这段代码,大家觉得会否报错?如果参考之前的 `String` 所有权转移的例子,那这段代码也应该报错才是,但是实际上呢? + +这段代码和之前的 `String` 有一个本质上的区别:在 `String` 的例子中 `s1` 持有了通过`String::from("hello")` 创建的值的所有权,而这个例子中,`x` 只是引用了存储在二进制中的字符串 `"hello, world"`,并没有持有所有权。 + +因此 `let y = x` 中,仅仅是对该引用进行了拷贝,此时 `y` 和 `x` 都引用了同一个字符串。**如果还不理解也没关系,当学习了下一章节 "引用与借用" 后,大家自然而言就会理解。** + #### 克隆(深拷贝) 首先,**Rust 永远也不会自动创建数据的 “深拷贝”**。因此,任何**自动**的复制都不是深拷贝,可以被认为对运行时性能影响较小。 @@ -233,7 +248,7 @@ println!("x = {}, y = {}", x, y); Rust 有一个叫做 `Copy` 的特征,可以用在类似整型这样在栈中存储的类型。如果一个类型拥有 `Copy` 特征,一个旧的变量在被赋值给其他变量后仍然可用。 -那么什么类型是可 `Copy` 的呢?可以查看给定类型的文档来确认,不过作为一个通用的规则:**任何基本类型的组合可以是 `Copy` 的,不需要分配内存或某种形式资源的类型是 `Copy` 的**。如下是一些 `Copy` 的类型: +那么什么类型是可 `Copy` 的呢?可以查看给定类型的文档来确认,不过作为一个通用的规则:**保存在栈上的数据类型可以 `Copy`,任何基本类型的组合可以 `Copy` ,不需要分配内存或某种形式资源的类型是 `Copy` 的**。如下是一些 `Copy` 的类型: * 所有整数类型,比如 `u32`。 * 布尔类型,`bool`,它的值是 `true` 和 `false`。