kieran

Kieran‘s Blog

The world will be better?
github

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]

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 的编译器和链接器会对代码中字符串的使用做一系列的优化,完全不用担心这个问题(具体做了什么优化可以自行搜索学习一下)

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。