【Rust中级教程】1.4. 内存 Pt.2:栈内存、栈帧(stack frame)、栈指针(stack pointer)
1.4 内存 Pt.2栈内存、栈帧(stack frame)、栈指针(stack pointer)1.4.1. 内存区域程序有很多的内存区域并不都是在DRAM上的。三个比较重要的区域是栈内存stack、堆内存heap和静态内存staic。栈内存和堆内存相对比栈内存更快堆内存更慢。1.4.2. 栈内存(stack)有这么一个公理叫做“有疑问时首选Stack”。但是如果想把数据放在栈内存编译器就必须知道类型的大小。换句话说“有疑问时首选实现了Sized的类型”关于Sized trait的详细内容见【Rust自学】19.5.4. 动态大小和和Sizedtrait。Stack是一段内存程序把它作为一个暂存空间用于函数调用。为什么会叫stack呢因为在stack上的条目是LIFO(Last In First Out后进先出)Stack Frame每个函数被调用在stack的顶部都会分配一个连续的内存块叫做stack frame(栈帧)。在接近stack底部附近是main函数的frame随着函数的调用其余的frames都推到了stack上。函数的frame包含着函数里的所有变量以及函数所带的参数。当函数返回时它的frame就被回收了。构成函数本地变量值的那些字节不会被立即擦除但访问它们是不安全的因为它们可能会被后续的函数调用所重写如果后续函数调用的frame与回收的这个有重合的话。但即使没有被重写它们也可能包含无法使用的值。例如函数返回后被移动的值。Stack Frame也叫activation frames或allocation record。只有activation frames被分配在stack上时才叫stack frame。每个stack frame的大小是不同的。在函数调用期间stack frame会包含函数的状态。当一个函数在另外一个函数内调用时原来的函数的值会被及时冻结。stack fram为函数参数指向原来调用栈的指针以及本地变量不包括在堆内存上分配的数据提供空间。stack的主要任务在于为本地变量创造空间原因在于stack里所有变量都是紧挨着的找起来更快。看个例子fn main() { let pw justok; let is_string is_strong(pw); } fn is_strong(password: String) - bool { password.len() 5 }输出error[E0308]: mismatched types -- src/main.rs:3:31 | 3 | let is_string is_strong(pw); | --------- ^^ expected String, found str | | | arguments to this function are incorrect | note: function defined here -- src/main.rs:6:4 | 6 | fn is_strong(password: String) - bool { | ^^^^^^^^^ ---------------- help: try using a conversion method | 3 | let is_string is_strong(pw.to_string()); | 问题很明显pw是str类型的is_strong函数的参数是String类型。我们的目标就是让is_strong函数兼容str和String类型。这个目标看起来挺简单但其实有点麻烦String拥有堆上的缓冲区而str只是指向某段UTF-8字节的胖指针这些字节可能在静态内存、堆上或其他地方这两个类型的转换不简单。看看修改后的代码fn is_strongT: AsRefstr(password: T) - bool { password.as_ref().len() 5 }这么写就是把传进来的参数作为到str的引用。也可以这么改fn is_strongT: IntoString(password: T) - bool { password.into().len() 5 }这么写就是把传进来的参数转化为String。但是这些写法都涉及到了比较多的转化。还可以这么写use std::fmt::Display; fn is_strongT: Display(password: T) - bool { password.to_string().len() 5 }通过to_string方法把参数转化成String类型再操作。这个操作比上一个更慢。Stack Pointer随着程序的执行CPU里有一个游标会随着更新它反映当前stack frame的当前地址这个游标就叫做stack pointerstack指针。随着函数内不断地调用函数stack就会增长stack pointer从stack frame开始而stack pointer的值就会减少越接近stack frame的地方内存地址更大当函数返回stack pointer的值会增加当函数返回时它的frame就被回收了游标向stack frame接近值就变大。Stack Frame的消失stack frames会最终消失的这个事实与Rust生命周期的概念是密切相关的。任何存储在stack上的变量在frame消失后就无法访问了。所以任何到stack上的变量的生命周期最多只能与frame的生命周期一样长。

相关新闻

【Rust中级教程】1.5. 内存 Pt.3:深入探究Rust堆内存底层实现

【Rust中级教程】1.5. 内存 Pt.3:深入探究Rust堆内存底层实现

1.5 内存 Pt.3:深入探究Rust堆内存底层实现 1.5.1. 堆内存(Heap) Heap意味着混乱,而stack则相对比较整齐。Heap是一个内存池,并没有绑定到当前程序的调用栈,而stack绑定到当前程序的调用栈。Heap是为在编译时没有已知大小的类型…

2026/7/24 20:41:08 阅读更多 →
【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注

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

1.6 内存 Pt.4:静态(static)内存与static生命周期标注 1.6.1. 静态(static)内存 static内存实际上是一个统称,它指的是程序编译后的文件中几个密切相关的区域。当程序执行的时候,这些区域会自动加载到内存里。 static内存里的值会在程序执行期…

2026/7/24 20:41:08 阅读更多 →
若依项目Linux生产环境治理:文件系统权限配置实战

若依项目Linux生产环境治理:文件系统权限配置实战

前言记得有一次,开发同事需要查看 application.yml 里的数据库连接配置,看完之后顺手按了上下键,不小心执行了上一条 vim application.yml,然后手滑按了几个键,保存退出了。等他反应过来,配置已经乱了&…

2026/7/24 20:41:08 阅读更多 →

最新新闻

黑马点评-Redis消息队列

黑马点评-Redis消息队列

Redis消息队列(Message Queue),存放消息的队列。最简单的消息队列模型包括3个角色:消息队列:存储和管理消息,也被称为消息代理(Message Broker)生产者:发送消息到消息队列消费者&…

2026/7/24 20:49:10 阅读更多 →
2026华为OD面试题038:流量波峰

2026华为OD面试题038:流量波峰

题目描述 一线运维人员在监控通话流量,每隔一段时间采一个点,流量有高有低,连起来就是一波一波的峰谷。运维小哥想找到那个"变化最快"的波峰。 给定一个整数数组 nums,代表采样点的流量值。请找到满足下面条件的三元组 (i, j, k): i < j < k nums[i] &l…

2026/7/24 20:49:10 阅读更多 →
高速ADC JESD204B接口配置与调试实战:以TI ADC12DJ2700为例

高速ADC JESD204B接口配置与调试实战:以TI ADC12DJ2700为例

1. 项目概述与核心价值如果你正在设计一个需要处理GHz级别射频信号的数据采集系统&#xff0c;比如5G基站、相控阵雷达或者高端示波器&#xff0c;那么你大概率绕不开高速ADC和JESD204B接口。我最近在调试一块基于TI ADC12DJ2700的采集卡&#xff0c;这颗芯片最高能跑到2.7 GSP…

2026/7/24 20:49:10 阅读更多 →
2026华为OD面试题037:池化资源共享—— 模拟 + 台账数组经典题

2026华为OD面试题037:池化资源共享—— 模拟 + 台账数组经典题

题目编号:037 难度:中等 考点:模拟、数组操作、资源调度、台账记录 推荐指数:⭐⭐⭐⭐⭐ 📋 题目描述 一个局部互联区域里有 n 台设备,每台设备都有一些空闲资源,可以池化共享。用户会发起两种操作: 操作类型 操作 1 x(申请资源) 本次申请需要 x 个资源 系统返回…

2026/7/24 20:49:10 阅读更多 →
机器视觉10 —— CogResultsAnalysisTool 结果分析工具

机器视觉10 —— CogResultsAnalysisTool 结果分析工具

在不使用脚本的情况下&#xff0c;使用 CogResultsAnalysisTool 结果分析工具来计算图像中硬币的个数和总金额并显示结果。CogResultsAnalysisTool 是康耐视&#xff08;Cognex&#xff09;VisionPro 中用于分析和评估图像处理结果的工具。以下是其详细介绍&#xff1a;功能特点…

2026/7/24 20:49:10 阅读更多 →
从“被生活推动”,进入“主动创造”。

从“被生活推动”,进入“主动创造”。

人生最大的转变&#xff0c;不是环境突然变好了&#xff0c;而是一个人从“反应模式”进入“创造模式”。很多人每天都很忙。 但忙完之后发现&#xff1a; 好像一直在处理事情。 却没有真正建设自己的生活。第一层&#xff1a;什么叫“被生活推动”&#xff1f; 被生活推动的人…

2026/7/24 20:48:09 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化&#xff0c;核心特色&#xff1a;三维 X/Y/Z 三轴空间&#xff0c;所有散点分布在 0~10 立方体空间内&#xff1b;散点使用径向渐变实现立体 3D 圆球质感&#xff1b;支持鼠标 / 触屏拖拽画布&#xff0c;…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls&#xff1a;进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值&#xff0c;并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻