【Rust中级教程】1.5. 内存 Pt.3:深入探究Rust堆内存底层实现
1.5 内存 Pt.3深入探究Rust堆内存底层实现1.5.1. 堆内存(Heap)Heap意味着混乱而stack则相对比较整齐。Heap是一个内存池并没有绑定到当前程序的调用栈而stack绑定到当前程序的调用栈。Heap是为在编译时没有已知大小的类型准备的而stack上的数据在编译时大小必须已知。如图heap上的数据存放的位置和自身的大小都是不一定的比较常见的情况是stack有一个指针指向heap上的数据。什么叫在编译时大小不已知- 一些类型会随着时间变大或变小例如String、VecT。这些类型本身是Sized的在栈上是固定大小的结构体但它们拥有的缓冲区在堆上可以改变大小。- 另一些类型的大小不会改变但是无法告诉编译器需要分配多少内存- 另一个例子是trait对象详见 【Rust自学】19.5.4. 动态大小和和Sizedtrait它允许程序员模拟一些动态语言的特性——将多个类型放进一个容器- 真正的动态大小类型(dynamically sized types简称DST)——也叫unsized types——包括切片如str、[T]以及trait对象如dyn Trait。String和VecT本身不是DST它们是通过一个Sized句柄来管理堆上动态大小数据的。Heap允许你显示地分配连续的内存块。当这么做时你就会得到一个指针它指向内存开始的地方。Heap中的值会一直有效直到你对它显式地释放。如果你想让值活得比当前函数frame详见 1.4. 内存 Pt.2的生命周期还长就很有用。如果值是函数的返回值那么调用函数可以在它的stack上留一些空间给被调用函数让它把值在返回前写入进去。1.5.2. 堆内存与线程安全如果想要把值送到另一个线程当前线程可能根本无法与那个线程共享stack frames你就可以把它存在堆内存上。因为函数返回时堆内存上的分配不会消失所以你在一个地方为值分配内存把指向它的指针传给另一个线程就可以让那个线程安全地操作于这个值。换一种说法当你分配堆内存时结果指针会有一个无约束的生命周期你的程序想让数据活多久都行。1.5.3. 堆内存的交互机制堆内存上的变量必须通过指针访问。看个例子fn main(){ let a: i32 40; // Stack let b: Boxi32 Box::new(60); // Heap let result a b; let result a *b; println!({} {} {}, a, b, result); }输出error[E0277]: cannot add Boxi32 to i32 -- src/main.rs:4:20 | 4 | let result a b; | ^ no implementation for i32 Boxi32 | help: the trait AddBoxi32 is not implemented for i32 help: consider dereferencing here | 4 | let result a *b; | a是i32类型放在栈内存上的b是Boxi32类型放在堆内存上的但是这么写肯定是有问题的问题出在let result a b;上堆内存上的数据必须通过指针来访问b是指针a是数字两者类型不同肯定不能相加。所以我们删掉这句话把原代码改成fn main(){ let a: i32 40; // Stack let b: Boxi32 Box::new(60); // Heap let result a *b; println!({} {} {}, a, b, result); }let result a *b;通过*对b进行了解引用把指针指向的值60取出来了。输出40 60 100Rust与堆内存的交互方式Rust里与堆内存交互的主要方式就是BoxT类型。当我们使用Box::new函数创建类型为BoxT的实例时值传进Box::new函数的参数就会被放在堆内存上返回的(BOxT)就是指向堆内存上的指针。当Box被丢弃时内存就会被释放。如果忘记释放堆内存就会导致内存泄漏。但有时候程序员会故意让内存泄漏例如有一个只读的配置整个程序都需要访问它。这时候就可以通过Box::leak得到一个‘static引用从而显式地让其进行泄露。看个例子use std::mem::drop; fn main(){ let a Box::new(1); let b Box::new(1); let c Box::new(1); let result1 *a *b *c; drop(a); let d Box::new(1); let result2 *b *c *d; println!({} {}, result1, result2); }使用std::mem::drop函数可以手动释放我们讲讲这个程序的逻辑- 首先声明了变量a、b和c值都是存储在堆内存上的1Boxi32类型- 使用*对三个变量都进行解引用然后相加得到result1- 得到result1之后使用drop函数直接抛弃了a- 然后声明了变量d值是存储在堆内存上的1Boxi32类型- 使用对*三个变量(b、c和d)进行解引用然后相加得到result2- 打印出result1和result2我们用一张图来看看这个程序执行中内存的变化

相关新闻

【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/8/18 3:52:50 阅读更多 →
若依项目Linux生产环境治理:文件系统权限配置实战

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

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

2026/8/10 6:14:29 阅读更多 →
AssetRipper终极指南:轻松提取Unity游戏资源的免费开源神器

AssetRipper终极指南:轻松提取Unity游戏资源的免费开源神器

AssetRipper终极指南:轻松提取Unity游戏资源的免费开源神器 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 你是否曾经遇到过这样的困境?想要分析一个Unity…

2026/8/17 19:03:18 阅读更多 →

最新新闻

Python 分析流程的安全入口别漏查

Python 分析流程的安全入口别漏查

Python 分析流程的安全入口别漏查 权限、密钥与供应链风险的安全防线要落到具体对象上讨论。对本文涉及的分析流程,先约定输入是文件或接口输入、配置和任务参数,交付物是数据结果、运行日志和待处理项。以下内容用于梳理设计和验证方法,不假…

2026/8/18 3:52:18 阅读更多 →
HTML5视频播放失败排查指南:从编码格式到浏览器兼容性

HTML5视频播放失败排查指南:从编码格式到浏览器兼容性

1. 问题引入&#xff1a;一个看似简单的标签&#xff0c;为何频频“罢工”&#xff1f; 作为一名前端开发者&#xff0c;相信你对 <video> 标签再熟悉不过了。它被设计出来&#xff0c;就是为了让网页原生播放视频变得像插入一张图片一样简单。理想很丰满&#xff0c;…

2026/8/18 3:52:18 阅读更多 →
SQL 优化效果别只凭感觉判断

SQL 优化效果别只凭感觉判断

SQL 优化效果别只凭感觉判断 单元、集成与端到端测试分层策略要落到具体对象上讨论。对本文涉及的查询请求&#xff0c;先约定输入是SQL 文本、参数和数据源标识&#xff0c;交付物是查询计划、结果集和错误码。以下内容用于梳理设计和验证方法&#xff0c;不假设任何未经证实的…

2026/8/18 3:52:18 阅读更多 →
WebSphere 8.5.5 企业级安装与配置实战:从环境准备到生产部署

WebSphere 8.5.5 企业级安装与配置实战:从环境准备到生产部署

1. 项目概述&#xff1a;为什么今天还要折腾WebSphere 8.5.5&#xff1f;如果你是一位负责维护传统企业核心应用系统的工程师&#xff0c;或者正在接手一个运行了多年的老项目&#xff0c;那么“WebSphere 8.5.5”这个名字对你来说一定不陌生。它可能代表着一段历史&#xff0c…

2026/8/18 3:52:18 阅读更多 →
网络安全零基础入门:学习路线与避坑指南

网络安全零基础入门:学习路线与避坑指南

1. 为什么网络安全入门总是踩坑&#xff1f;刚接触网络安全的新手常会遇到几个典型问题&#xff1a;要么一上来就啃晦涩难懂的理论书籍&#xff0c;要么直接上手复杂工具却连基础命令都搞不明白&#xff0c;更常见的是东一榔头西一棒子地学&#xff0c;最后连完整的渗透测试流程…

2026/8/18 3:52:18 阅读更多 →
基于Lean 4的硬件形式化验证:CircuitProver框架与可复用证明库实践

基于Lean 4的硬件形式化验证:CircuitProver框架与可复用证明库实践

1. 项目概述&#xff1a;当形式化验证遇见硬件设计最近在硬件验证的圈子里&#xff0c;一个老生常谈但又始终绕不开的痛点就是&#xff1a;如何确保我们设计的电路&#xff0c;从RTL代码到最终的硅片&#xff0c;其行为完全符合我们的数学规格&#xff1f;传统的仿真和断言验证…

2026/8/18 3:51:18 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图&#xff1a;用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手&#xff1a;7个字重免费商用&#xff0c;从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻&#xff1a;设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南&#xff1a;GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →