当前位置: 首页 > news >正文

【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寄存器,并将其视为优化。实际上,如果变量不需要内存地址,编译器可以使用寄存器而不是内存区域来存放变量。

http://www.jsqmd.com/news/1257189/

相关文章:

  • 开发小程序公司有哪些选择?标准SaaS与源码定制怎么分
  • 【Rust中级教程】2.4. API设计原则之不意外性(unsurprising) Pt.4:“人体工程学”的trait实现、包装类型(Wrapper Types)、`Borrow` trait
  • Nature子刊 IF=15.1 | 让肾移植决策“可审计”:大语言模型如何打通数据与政策
  • 工具很火,团队效率却没提升?2026 年程序员靠“可观测性”拿 Offer
  • 分享学习C语言代码思维和逻辑二次记录
  • 2026 年更新:银川值得关注的全自动两滚卷圆机加工厂综合实力解析,告别手忙脚乱:这台机器如何颠覆你的卷装效率?-伟达机械 - 企业信息推荐【官方】
  • 小爱音箱音乐播放神器:XiaoMusic 完全指南,解锁无限音乐自由
  • WaveTools鸣潮工具箱:一键解锁游戏性能极限的终极指南
  • AI智能体技术解析:从原理到实践应用
  • 2026年船型开关怎么买?网上直购指南来了
  • 3个实用技巧,让SharpKeys帮你告别键盘布局烦恼
  • 开源项目终极指南:5步规避法律风险与合规运营
  • 告别网盘下载限制:九大网盘直链下载助手全攻略
  • 【LangGraph实战】《LangGraph实战》_45.[第3章 状态图结构] 递归限制:防止智能体陷入无限循环的安全阀
  • AMD Ryzen SMUDebugTool:硬件级调试与性能调优完全指南
  • Topit:macOS窗口置顶终极指南,彻底告别窗口遮挡烦恼
  • 道路车辆智能追踪、车牌识别、测速、区域入侵和实时监控的可落地方案
  • Shippy 的启示:可靠 Agent 不是更听话,而是更少犯错空间(3 个集合收缩 + 4 类边界 + 整套 Eval)
  • #历史迷思
  • Beyond Compare 5密钥生成技术深度拆解:从逆向工程到RSA算法实现
  • PTA基础编程题目集 7-1厘米换算英尺英寸(C语言实现)
  • 3分钟掌握Chrome滚动截图:免费开源工具的完整网页保存实战指南
  • Spring Boot 3 集成 ZooKeeper:从环境搭建到实战应用
  • 【Rust中级教程】2.5. API设计原则之灵活性(flexible) Pt.1:代码的契约(Contract)、使用泛型参数(generic arguments)让接口更灵活
  • 高性能SAR ADC电源与PCB布局设计:从理论到ADS892xB实战
  • 抖音批量下载神器:三分钟搞定创作者主页所有作品,无水印免费下载
  • 如何用Plain Craft Launcher 2打造完美Minecraft游戏体验:终极指南
  • 天天评选平台使用指南:四种投票类型选择说明
  • 《Spring Boot 4 与 Nacos 3.2.3 最强整合实战:配置管理 + 服务发现全解析》
  • [校大]27届江苏师范大学JAVA简历:中厂简历通过率1%