【Rust中级教程】1.3. 内存 Pt.1:各类概念的定义及变量的高级模型和低级模型

发布时间:2026/7/24 22:46:04
【Rust中级教程】1.3. 内存 Pt.1:各类概念的定义及变量的高级模型和低级模型 1.3 内存 Pt.1各类概念的定义及变量的高级模型和低级模型1.3.1. 值在讲内存之前我们得先讲三个概念第一个是值。值指的是类型 类型值域中的一个元素。例如true它的类型是bool类型它的值域里就两个值——一个true一个false。值指的是类型 类型值域中的一个元素true的值就是bool类型 值域中的元素true。通过值的类型表示可以转化为字节序列- 举个例子u8类型的6在内存中的表示就是0x06- 再看一个例子str的Hello World字符串它就是字符串值域里的一个值它的表示是utf-8编码注意值的含义是独立于存储它字节的位置的也就是值和存储它的位置没有直接关系它们是独立的两个概念1.3.2. 变量值会存储到一个地方或者说这个地方可以容纳值具体就是堆内存、栈内存或者其他地方。最常见的存储值的地方就是变量它是栈内存上一个被命名的槽用于存储值。1.3.3. 指针指针是一个值值里面存放的是一块内存的地址指针指向某个地方地址所对应的内存。指针可以被解引用(dereference)来访问它指向的内存里存放的值。可以把同一个指针放在不同的变量里也就是说多个变量可以间接地引用内存上的同一块区域也就是相同的底层的值。1.3.4. 深入变量变量可以被分为两种模型- 高级模型生命周期、借用...- 低级模型不安全代码、原始指针...变量的高级模型变量实际上就是给值一个名称。当值被赋给变量时这个值从那时起就由该变量命名了。举个例子:let variable 1234;如图1234这个数据此时就由variable这个变量命名了。当变量被访问时可以从变量的上次访问到这次访问画一条线从而在两次访问中建立依赖关系。如果变量被移动了就不能从它那里画线。这么说你可能不明白看个图你就懂了声明a第2行算一次访问把a赋给b第4行算另一次但是和打印出a第8行之间不能画线因为在此之前变量已经移动了第4行。在变量的高级模型中变量只会在它持有合法值的时候才存在。如果变量的值没有初始化或者已经被移动了那就无法使用画线的方法。使用这种模型整个程序会由许多依赖线组成这些线叫flow。每个flow都在追踪一个值的特定实例的生命周期。当有分支存在时flow可以分叉或合并并且每个分叉都在追踪该值的不同的生命周期。在程序中的任何给定点编译器可以检查所有的flow是否可以互相兼容并行存在。例如- 一个值不可能有两个具有可变访问的并行flow- 一个flow借用了一个值但却没有flow拥有该值变量的低级模型变量会给那些可能不存储合法值的内存地址进行命名。可以把变量想象为值的槽当你赋值时槽就装满了而它里面原来的值如果有的话就被丢弃或替换了。当访问它时编译器会检查槽是不是空的。如果是那么就说嘛变量未初始化或它的值被移动了。指向变量的指针其实是指向这个变量的幕后内存通过解引用可以获得它的值。注意在本例中我们忽略CPU寄存器并将其视为优化。实际上如果变量不需要内存地址编译器可以使用寄存器而不是内存区域来存放变量。