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

【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
请添加图片描述

1.6.1. 静态(static)内存

static内存实际上是一个统称,它指的是程序编译后的文件中几个密切相关的区域。当程序执行的时候,这些区域会自动加载到内存里。

static内存里的值会在程序执行期间一直存活。

程序的static内存是包含程序的二进制代码的(通常映射为只读的)。随着程序的执行,它会在文本段的二进制代码中挨个指令进行遍历,而当函数被调用时就进行跳跃。

static内存会持有使用static声明的变量的内存,也包括某些常量值,例如字符串。

1.6.2. ‘static生命周期标注

‘static是一个特殊的生命周期,它的名字来源于static内存区。它将引用标记为只要static内存还存在(也就是程序关闭之前),那么引用就合法

static变量的内存在程序开始运行时就分配了。指向static内存中变量的引用,按定义来说,就是'static的,因为在程序关闭之前它不会被释放;但是有'static生命周期标注的引用可以不指向static内存。

既然'static生命周期标注的引用可以不指向static内存,为什么还要把这种生命周期命名为'static呢?有'static标注但不存储在static内存里这不是误导人吗?

  • 'static这个名称仍然适用的原因在于:一旦你创建了一个'static的生命周期的引用,就程序的其余部分而言,它所指向的内存都可能在static内存中,因为程序想要使用它多久都没问题

话句话说:'static这个名字可能会让人误以为所有带有'static生命周期的引用都指向静态内存区(即程序运行期间一直存在的全局变量或常量)。但实际上,'static只是表示这个引用在整个程序生命周期内都是有效的,至于它指向的内存是否真的存储在静态区,并不一定。换句话说,'static生命周期的引用意味着 “这个引用可以一直存在,程序可以随时使用它”,但并不强制要求它的内容必须是静态分配的。

在写Rust代码的时候,遇到更多的会是'staic生命周期标注而不是static内存。'static经常出现在类型参数的trait bounds上。

例如T: 'static就代表类型T可以存活我们想要的任何时长(知道程序关闭),同时这也要求T拥有所有权的并且是自给自足的。这代表着这个类型要么它不借用其它(非static)值,要么它借用的东西是static的。这样就能保证类型能活到程序结束。

1.6.3. conststatic的区别

const关键字会把紧随它的东西声明为常量,例如:

const X: i32 = 123;
  • X被声明为了常量

常量可在编译的时候完全计算出来。在计算期间,任何引用常量的代码会被替换为常量的计算结果值。

例如:

const X: i32 = 123;
println!("{}", X);

这句话中的打印操作就会在编译时被改为:

println!("{}", 123);

所以常量没有内存或关联其它存储(因为它不是一个地方)。你可以把常量理解为某个特殊值的方便的名称。

http://www.lryc.cn/news/537726.html

相关文章:

  • 【设计模式】【行为型模式】解释器模式(Interpreter)
  • 修改OnlyOffice编辑器默认字体
  • React echarts柱状图点击某个柱子跳转页面
  • wordpress主题插件开发中高频使用的38个函数
  • ElasticSearch基础和使用
  • qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到view、通过view得scene
  • 小白win10安装并配置yt-dlp
  • 【kafka系列】broker
  • 用大模型学大模型05-线性回归
  • Python实现AWS Fargate自动化部署系统
  • 国产编辑器EverEdit - 上下翻滚不迷路(历史编辑位置、历史光标位置回溯功能)
  • 今日写题work05
  • [C++语法基础与基本概念] std::function与可调用对象
  • 两个实用且热门的 Python 爬虫案例,结合动态/静态网页抓取和反爬策略,附带详细代码和实现说明
  • 华象新闻 | 2月20日前谨慎升级 PostgreSQL 版本
  • 跳跃游戏 II - 贪心算法解法
  • 图像质量评价指标-UCIQE-UIQM
  • CentOS上安装WordPress
  • Spring Boot 原理分析
  • Git 本地项目上传 GitHub 全指南(SSH Token 两种上传方式详细讲解)
  • jenkins服务启动-排错
  • CF 144A.Arrival of the General(Java实现)
  • SAP-ABAP:SAP中REPORT程序和online程序的区别对比
  • Java发展史
  • vue3--SVG图标的封装与使用
  • Datawhale Ollama教程笔记3
  • 学习数据结构(10)栈和队列下+二叉树(堆)上
  • 洛谷 P3660 USACO17FEB Why Did the Cow Cross the Road III 题解
  • 【数据结构】(9) 优先级队列(堆)
  • 如何提升爬虫获取数据的准确性?