Appearance
第 13 章 借用检查
在前文中,我们已经讨论了 Rust 在内存管理方面的语法。本文将主要探讨 Rust 实现无性能损失的“内存安全”的原理。
Rust 语言的核心特点是:在没有放弃对内存的直接控制力的情况下,实现了内存安全。所谓对内存的直接控制能力,前文已经有所展示:可以自行决定内存布局,包括在栈上分配内存,还是在堆上分配内存;支持指针类型;可以对一个变量实施取地址操作;有确定性的内存释放;等等。
另一方面,从安全性的角度来说,我们可以看到,Rust 有所有权概念、借用指针、生命周期分析等这些内容。初学者在刚开始碰到这些概念的时候,往往会觉得无所适从,感觉太麻烦、太复杂了。随便写个小程序都编译不通过,学习曲线非常陡峭。那么,Rust 设计者究竟是如何考虑的这个问题,为什么要设计这样复杂的规则?Rust 语言的这一系列安全规则,背后的指导思想究竟是什么呢?
总的来说,Rust 的设计者们在一系列的“内存不安全”的问题中观察到了这样的一个结论:
Danger arises from Aliasing+Mutation
首先我们介绍一下这两个概念 Alias 和 Mutation。
(1)Alias 的意思是“别名”。如果一个变量可以通过多种 Path 来访问,那它们就可以互相看作 alias。Alias 意味着“共享”,我们可以通过多个入口访问同一块内存。
(2)Mutation 的意思是“改变”。如果我们通过某个变量修改了一块内存,就是发生了 mutation。Mutation 意味着拥有“修改”权限,我们可以写入数据。
Rust 保证内存安全的一个重要原则就是,如果能保证 alias 和 mutation 不同时出现,那么代码就一定是安全的。
在本书中,笔者将此规则总结为:共享不可变,可变不共享。