rust基础语法学习(1)

rust 基础语法学习

本文以《Comprehensive Rust》教材作为学习素材，快速熟悉 rust 语法；同时阅读范长春老师的《深入浅出 Rust》来加深理解。

笔者之前在做 cpp 开发，所以在学习 rust 的过程中会下意识和 cpp 相比较，思考语法的不同并探究为什么这样做的原因。

关于共享引用和独占引用

在 rust 中貌似没有像 cpp 一样给开发者以使用指针的权利，而是只有引用这个概念（虽然引用的本质就是指针）。其中引用又分为共享引用和独占引用，符号上的直观形象是这样的 &T和 &mut T 。主要区别体现在借用规则上。

共享引用（&T）：共享引用是只读访问，无法改变指向的值；这样的好处就是允许多重借用，多线程访问相对安全。

独占引用（&mut T）：独占引用允许对数据进行修改，但是只能存在一个独占引用，且不能有共享引用。

这些规则由 rust 编译器在编译时强制执行，两种引用类型保证了内存和线程安全。cpp 的话又是 const 又是 & 的，能存在四种不同的情况。

两种字符串String 和 &str

在 rust 中存在两种字符串类型。String 是一种存放在堆内存上，存在所有权的 utf-8 编码字符串；而&str 是 utf-8 编码字符串的切片，相当于&[u8] 。

Copy
fn main() {
let s1: &str = "World";
let mut s2: String = String::from("Hello ");
}

上述代码种 s1 是对 World 这个字符串的切片，是一种借用，这个 World 其实存放的位置是在程序的只读数据段。而 s2 这个变量存放的位置是堆内存，s2 拥有这个字符串的所有权。

看到这种设计之后，我在思考为什么没有给在栈上分配字符串的方式？有些局部变量只在一个作用域内定义，如果每个字符串字面量都存在只读数据段，会不会造成冗余的内存占用？

问了 GPT 之后得如下答案：1. s1 其实也相当于栈上的变量，只不过 s1 不需要对只读区的字符串字面量负责，这个 World 在程序结束后由系统处理；而 s2 这个堆上的字符串，在 s2 的生命周期结束时，会调用 drop 函数回收内存。2. 大概结论是 Rust 的编译器和链接器会对代码中字符串的使用做一系列的优化，完全不用担心这个问题（具体做了什么优化可以自行搜索学习一下）