「深挖Rust」Rust 内存模型 - 1

「这是我参与2022首次更文挑战的第 24 天,活动详情查看:2022首次更文挑战」。


不是所有的内存都是同等的。在大多数编程环境中,程序可以访问堆栈、堆、寄存器、文本段、内存映射的寄存器、内存映射的文件,也许还有非易失性RAM。不过在特定情况下,你选择使用哪一个,对你能在这个存储区域存储什么,它能保持多长时间,以及你用什么机制来访问它都有影响。

这些内存区域的具体细节因平台而异,超出了本书的范围,但有些内存区域对你如何推理Rust代码非常重要,因此值得在此介绍。

存储区域术语

在深入研究内存区域之前,你首先需要了解 值、变量和指针 之间的区别。

Rust中的值是:类型和该类型所表达值域的一个元素的组合。一个值可以使用其类型的表示法转换为字节序列。但就其本身而言,你可以认为一个值更像是你这个程序员的意思。

例如,u8类型中的数字6是数学整数6,它在内存中的表示是字节0x06。同样,字符串 "Hello world" 是所有字符串表达范围中的一个值,其表示方法是UTF-8编码。一个值的意义与这些字节存储的位置无关。

一个值被存储在一个地方,这是Rust的术语,意思是 "一个可以容纳一个值的位置"。这个地方可以在栈上,也可以在堆上,或者在其他一些位置。最常见的存储值的地方是一个变量,它是栈上的一个命名为 "该变量" 的槽。

指针是一个持有内存区域地址的数值,因此指针指向一个地方。指针可以被 "解引用" 以访问存储在它所指向的内存位置中的值。我们可以在一个以上的变量中存储同一个指针,因此有多个变量间接地指向内存中的同一个位置,从而指向同一个底层值。

下面的代码,它说明了这三个要素。

let x = 42;
let y = 43;
let var1 = &x;
let mut var2 = &x;
var2 = &y;
复制代码

猜你喜欢

转载自juejin.im/post/7068642858521067533