深入理解 Rust 中的 `Box<T>`:堆上的数据与递归类型
1. Box<T>
的基础知识
1.1 堆与栈的分工
在默认情况下,Rust 会将变量存储在栈上。然而,栈的空间有限,且对于大小未知或极大的数据来说,栈并不适用。使用 Box<T>
,我们可以将数据存放在堆上,而在栈上仅保留一个指针。例如:
let b = Box::new(5);
println!("b = {}", b);
在这个例子中,变量 b
是一个 Box<i32>
,它指向堆上存储的值 5
。当 b
离开作用域时,Rust 会自动清理栈上的指针和堆上的数据。
1.2 性能优势
使用 Box<T>
主要有两个优势:
- 内存效率:虽然将数据存放在堆上可能带来少量的性能开销,但相比直接在栈上复制大量数据,使用指针传递仅复制固定大小的指针数据,效率更高。
- 灵活性:在需要存储大小未知的数据或大数据块时,通过
Box<T>
可以避免因数据复制带来的额外开销。
2. 利用 Box<T>
实现递归类型
2.1 递归类型的问题
在某些情况下,我们需要定义递归的数据结构,例如链表(cons list)。在传统的递归类型定义中,每个节点可能包含下一个节点的数据。如果直接嵌套这种类型,Rust 在编译时就无法确定数据结构的大小,导致“类型大小无限”的错误。
例如,下面的枚举定义会报错:
enum List {Cons(i32, List),Nil,
}
因为 Cons
变体包含一个 List
,这会导致无限嵌套,从而无法计算总大小。
2.2 使用 Box<T>
打破无限嵌套
为了解决上述问题,我们可以利用 Box<T>
引入一个间接层次。通过让 Cons
变体存储 Box<List>
而不是直接存储 List
,Rust 就能知道 Box<T>
的大小(仅仅是指针大小),从而计算整个数据结构的大小:
enum List {Cons(i32, Box<List>),Nil,
}
这种方式使得每个 Cons
节点包含一个 i32
值和一个指向下一个节点的指针。虽然链表的结构仍然是递归的,但由于指针大小是已知的,编译器便能成功计算出整个数据结构的内存需求。
2.3 Cons List 实例解析
Cons list 源自 Lisp 语言,用来构建链表数据结构。在 Rust 中,我们可以利用上述方法实现一个简单的 cons list。举例来说,构造列表 1, 2, 3
可以表示为:
(1, (2, (3, Nil)))
在 Rust 中,通过如下方式来创建这个列表:
enum List {Cons(i32, Box<List>),Nil,
}use List::{Cons, Nil};fn main() {let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));// 此处可以加入对 list 的操作
}
通过这种方式,我们不仅成功解决了递归类型大小不确定的问题,同时也利用了 Box<T>
的间接性,保持了数据结构的灵活性和内存高效性。
3. Box<T>
的更多使用场景
除了用于递归类型,Box<T>
在其他几个场景中也非常有用:
- 大小未知类型:当类型的大小在编译时未知时,
Box<T>
可以帮助我们将数据放在堆上,从而在栈上只保存指针。 - 高效所有权转移:对于大量数据的所有权转移,直接复制整个数据可能耗时,而传递指针则更高效。
- Trait 对象:当你只关心某个 trait 的实现而不在乎具体类型时,使用
Box<dyn Trait>
能够让你的代码更具灵活性。(详见 Rust 中的 trait 对象相关内容)
4. 小结
在本文中,我们探讨了 Box<T>
在 Rust 中的基础用法及其在实际编程中的应用。通过将数据存储在堆上,Box<T>
不仅为我们提供了内存管理上的便利,还能解决诸如递归类型等编译时大小不确定的问题。无论是为了优化大数据的所有权转移,还是在使用 trait 对象时提高灵活性,Box<T>
都是一种非常有用的工具。
掌握这些概念后,你可以在编写更复杂的数据结构时自信地使用 Box<T>
,并深入理解 Rust 的内存管理机制。希望这篇博客能帮助你更好地理解和应用 Box<T>
。Happy coding!
相关文章:
深入理解 Rust 中的 `Box<T>`:堆上的数据与递归类型
1. Box<T> 的基础知识 1.1 堆与栈的分工 在默认情况下,Rust 会将变量存储在栈上。然而,栈的空间有限,且对于大小未知或极大的数据来说,栈并不适用。使用 Box<T>,我们可以将数据存放在堆上,而…...
js原型和原型链,到底咋回事?
js原型和原型链,到底咋回事? js原型的原理 在 JavaScript 里,每个对象都有一个“隐藏的小伙伴”,这个“小伙伴”就是原型。可以把原型想象成一个模板或者一个仓库,对象能从它这个“小伙伴”那里借用一些属性和方法。…...
深入理解IP地址与端口:网络通信的基石
深入理解IP地址与端口:网络通信的基石 文章大纲 网络通信基础概念 1.1 什么是网络通信1.2 OSI模型与TCP/IP模型1.3 数据包传输原理 IP地址深度解析 2.1 IP地址定义与作用2.2 IPv4与IPv6对比2.3 子网划分与CIDR表示法2.4 公网IP与私网IP2.5 特殊IP地址详解 端口机…...
ubuntu系统本地部署deepseek
1、安装ollama 用Ollama部署deepseek模型,官网地址:https://ollama.com/download 根据官网给出的命令直接安装(安装linux版本) curl -fsSL https://ollama.com/install.sh | sh2、安装deepseek-r1模型 我这里用了8b,…...
nginx ngx_http_module(10) 指令详解
nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module:HTTP/2支持模块,允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化,如多路复用、头部压缩和服务器推…...
rman 备份恢复1
前提: rman用户必须具有sysdba权限 使用常用连接方式如下: rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一个rman连接会产生两个进程,action字段为空的就是rman的监控进程,另…...
BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景
在数据爬取中,BeautifulSoup、lxml/XPath和正则表达式的适用场景各有侧重,具体选择需根据数据特征和需求权衡: 1. BeautifulSoup(结合CSS选择器) 适用场景 简单结构页面:标签层级清晰、属性固定的HTML页面…...
Python装饰器本质250220
定义一个函数,在不修改这个函数的代码的情况下,让函数执行前后会有新的内容加入 def func():print("func")return def outer():def inner():print("new code before")func()print("new code after")returnreturn inner f…...
实时、分时、半实时半分时操作系统
在操作系统中,实时、分时、半实时半分时是三种不同的调度策略,它们决定了系统如何分配和管理CPU资源。以下是它们的定义和举例: 1. 实时操作系统(RTOS, Real-Time Operating System) 定义:实时操作系统是…...
玩转Docker | 使用Docker部署本地自托管reference速查表工具
玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...
基于springboot校园健康系统的设计与实现(源码+文档)
大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…...
孤独症项目(1)
年也过了,也不能一直玩,该学习还是要学习。 过年前我算是把环境配置好,然后把项目跑起来了,现在的问题是我看不懂这个代码什么意思 代码还是要一行一行看,每一行都看懂了,全文自然就知道了 1 from pathlib…...
DeepSeek 冲击(含本地化部署实践)
DeepSeek无疑是春节档最火爆的话题,上线不足一月,其全球累计下载量已达4000万,反超ChatGPT成为全球增长最快的AI应用,并且完全开源。那么究竟DeepSeek有什么魔力,能够让大家趋之若鹜,他又将怎样改变世界AI格…...
《被讨厌的勇气》(七)
1.共同体感觉是幸福的人际关系的最重要的指标。 2.把对自己的执著变成对他人的关心。 3.不能进行“课题分离”、一味拘泥于认可欲求的人也是及其以自我为中心的人。 4.一味在意“他人怎么看”的生活方式正式只关心“我”的自我中心式的生活方式。 5.别人并不是为了满足你的期待…...
【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
在日常办公和学习中,将Word文档转换为PDF格式的需求非常普遍。无论是制作简历、撰写报告还是分享文件,都需要确保文档格式在不同设备上保持一致。而小白工具的“Word转PDF”功能正是为此需求量身打造的一款高效解决方案。 【Word转PDF】在线Doc/Docx转换…...
SpringCloud面试题----eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别
dEureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们的区别主要体现在以下几个方面: 设计理念 Eureka:是基于 RESTful 风格设计的,强调简单、轻量级,旨在为微服务架构提供一种易于使用的服务发现解决方案,注重服务的可用性和灵活性。Zookeeper:最初是为分布式协…...
Matplotlib中strpdate2num()函数报错的解决方法
在Matplotlib绘图时,有时会从文件中读取形如“2025/2/20”格式的日期数据,在读取了日期数据后,会通过Matplotlib.dates.strpdate2num()函数将日期格式变为浮点数进行绘制。 1 matplotlib.dates不再支持strpdate2num()函数 使用matplotlib.d…...
easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题
需求背景:有一个需求要做下拉框的值有100多条,同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出,会出现下拉框的值过多,导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本:<depende…...
Java链表全解析:从单向链表到双向链表的实现与优化
一、链表的核心特性 链表是一种通过 节点 存储数据的线性数据结构,每个节点包含 数据域 和 指针域。节点在内存中 不连续存储,通过指针串联。 1.单向链表 2.双向链表 3.环形链表 环形单链表 环形双链表 4.链表的类型 类型结构描述典型应用场景单向链表每个节点只有 一个指…...
《动手学机器人学》笔记
目录 0.介绍1.概述|空间位置、姿态的描述(33)|《动手学机器人学》2.(2)-Robotics Toolbox①(V10.4)3.齐次坐标与变换矩阵4.一般形式的旋转变换矩阵5.(轴角法)…...
【小游戏】C++控制台版本俄罗斯轮盘赌
制作团队:洛谷813622(Igallta) 989571(_ayaka_) Mod:_ayaka_ 双人模式:Igallta 公告: 原先的9.8改名为 Alpha 1.0,以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…...
最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
👨💻群里有同学是做影视赛道的博主,听说最近DeepSeek这么火,咨询能不能用DeepSeek写影评,并整理电影数据资料,自动发布到飞书文档,把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...
Java集合框架之ArrayList解析
目录 一、ArrayList概述 二、优缺点分析 三、底层数据结构 四、源码分析ArrayList初始化容量 五、源码分析ArrayList扩容策略 六、ArrayList集合源码分析 1. 属性分析 2. 构造方法分析 无参构造方法 指定初始容量的构造方法 传入集合的构造方法 3. 添加元素 add(E…...
idea 2023.3.7常用插件
idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace …...
IM聊天系统架构实现
一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制; 1、重连机制(服务端下线) 服务端下线,客户端netty可以感知到,在感知的方法中进行重连的操作,注意重连可能连接到旧的服务器继续报错&…...
vue3可选链操作符(?.)
一、定义: 可选链操作符(?.)是 JavaScript 中的一个语法,用于安全地访问对象的属性,即使该对象为 null 或 undefined,也不会抛出错误,而是返回 undefined。 1、不使用可选链操作符࿱…...
科普:Docker run的相关事项
一、镜像名(含标签)太长 如,通过如下命令行: docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名(及标签)太长,可以通过改名的方法变短。 在 Docker 中&…...
petalinux高版本设置自动登录和开机自启动配置
petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…...
算法刷题-哈希表的总结
什么时候用数组、什么时候用map呢? 经常会混淆。 混淆1:例如有时候题目可能要求在一大堆元素里找目标元素,要求不能利用用过的字母,这就会让我想到只包含一个键值的set或者是map,但实际上忽略了字母(限定大…...
如何通过 Homebrew 安装 Qt 并配置环境变量
如何通过 Homebrew 安装 Qt 并配置环境变量 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形界面应用。本文将详细介绍如何在 macOS 上通过 Homebrew 安装 Qt 并配置环境变量,以便在终端和 Qt Creator 中使用 Qt 工具。 步骤 1:安装 Ho…...
RESTful 的特点与普通 Web API 的区别
RESTful 是一种设计风格,而不仅仅是普通的 Web API。它遵循一些特定的原则和约束,使得 API 更加简洁、可扩展和易于理解。以下是 RESTful 的特点,以及与普通 Web API 的区别: RESTful 的特点 1. 资源导向 RESTful API 的核心是资…...
Java和JavaScript当中的json对象和json字符串分别讲解
Java和JavaScript当中的json对象和json字符串分别讲解 一、Java当中的json对象和json字符串 在 Java 中,JSON 对象和 JSON 字符串有不同的表示和操作方式。 1. JSON 对象: 如果你使用的是 org.json 库,创建 JSON 对象的代码如下࿱…...
ARM64 Trust Firmware [四]
完成第二阶段 BL2 的操作后就加载并进入 BL31,BL31 位于 DRAM 中,EL3 模式。除了做架构初始化和平台初始化外,还做了如下工作: 基本硬件初始化,比如 GIC,串口,timer 等;PSCI 服务的…...
CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台
❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker,这是一个基于网络的计算平台,旨在简化和加速 EnzyDock 对接模拟的设置过程&…...
Sklearn常用算法及建模流程总结
Scikit-learn(简称 Sklearn)是 Python 中最流行的机器学习库之一,提供了丰富的算法和工具用于数据预处理、模型训练、评估和调优。下面整理了一些常用算法及建模流程,供大家参考学习。 1.常用算法分类 1. 监督学习(S…...
华为IPD简介
创作灵感 现在“熟悉华为IPD”经常出现在高级招聘岗位能力要求上,于是作者写下此文章以此巩固相关知识储备 名词解释 华为IPD(Integrated Product Development,集成产品开发)是华为引入并优化的一套产品开发管理体系࿰…...
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】
ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase17 作者:车端域控测试工程师 更新日期:2025年02月19日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-017测试用例 用例ID测试场景验证要点参考条款预期结果TC…...
html网络安全工具源码 网络安全前端
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 前端常见的网络安全包括:xss(跨站脚本攻击)、csrf(跨站请求伪造)、sql注入攻击等。 1)跨站…...
广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技
2月16日,广西壮族自治区园区投促中心党委书记、主任,自治区园区办党组成员陶德文率团来到深兰科技集团上海总部考察调研,并与深兰科技集团创始人、董事长陈海波等集团管理层座谈交流,双方围绕深兰科技人工智能项目落地广西的相关事…...
vue3创建项目
vue3创建项目 在 Vue 3 中创建项目通常涉及到使用 Vue CLI 或者 Vite。 Vue CLI 是官方推荐的脚手架工具,而 Vite 是近年来非常流行的现代前端开发工具,它提供了更快的热模块更新(HMR)和优化的开发服务器。 一、使用 Vue CLI 创…...
MySQL5.7 创建用户并授予超管权限脚本
记录MySQL5.7 创建新用户并授予超管权限脚本 用户与密码可任意设置 创建用户并设置密码 CREATE USER zhangsan % identified by 123456oo;修改用户密码 UPDATE USER set authentication_stringpassword("Abc123!") where user"zhangsan ";授予用户超管权…...
ESP32鼠标驱动(ble hid device_demo)【ESP32指向鼠标】
ESP32鼠标驱动(ble hid device_demo)【ESP32指向鼠标】 我使用的vscode开发esp32,用的是ESP-IDF v5.12固件,其提供了很多例程,在搜索里面输入“ESP-IDF: Show Examples Projects”,便可看到例程,如下图所示࿰…...
CSDN文章质量分查询系统【赠python爬虫、提分攻略】
CSDN文章质量分查询系统 https://www.csdn.net/qc 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链接-----> https://www.csdn.net/qc <------点击链接 点击链接-----> CSDN文章质量分查询系统 <------点击链接 点击链…...
vscode远程报错:Remote host key has changed,...
重装了Ubuntu系统之后,由20.04改为22.04,再用vscode远程,就出现了以上报错。 亲测有效的办法 gedit ~/.ssh/known_hosts 打开这个配置文件 删掉与之匹配的那一行,不知道删哪一行的话,就打开第一行这个 /.ssh/confi…...
【核心算法篇一】《DeepSeek视觉引擎:YOLOv8模型迁移实战》
某天深夜,算法工程师小王在办公室突然跳起来大喊:"mAP从0.91降到0.87了!"整个团队瞬间惊醒——这是正在将YOLOv8迁移到智能质检产线时遭遇的惊魂时刻。本文将以DeepSeek视觉引擎的实战经验,带你穿越模型迁移的雷区,揭秘工业级落地的核心技巧。(文末附完整训练参…...
如何在 ConstraintLayout 中将 ViewPager 始终置于 ll_title 的下方
关于如何在 ConstraintLayout 中将 ViewPager 始终置于 ll_title标题栏 的下方。。 如何将 ViewPager 始终置于 ll_title 下方 在 ConstraintLayout 中,可以通过约束来实现 ViewPager 始终位于 ll_title 标题栏的下方。以下是修改后的布局代码: <?…...
docker 安装 Rabbitmq 详解
在平常的开发工作中,我们经常会使用到 rabbitmq,rabbitmq 主要可以进行应用解耦、异步通信、流量削峰、负载均衡、消息持久化、死信队列等。比如商城系统,下单后,通过消息队列通知库存系统、积分系统、物流系统等。发送短信时通过…...
51单片机学习之旅——在LCD1602上显示时钟
新建工程 打开软件 LCD1602模块代码添加 因为我们在LCD1602上显示时钟,因此我们需要添加LCD1602的模块代码 跳转到这条博客51单片机学习之旅——模块化编程集_51单片机ruminant-CSDN博客,复制相关代码跳转到这条博客51单片机学习之旅——模块化编程集…...
pytest asyncio 支持插件 pytest-asyncio
pytest 是 Python 测试框架,但其不支持基于 asyncio 的异步程序(例如,测试 FastAPI 异步代码),pytest-asyncio 是一个 pytest 插件,该插件赋予 pytest 可以测试使用 asyncio 库代码的能力。 https://github…...
全平台搭载旭日5!科沃斯GOAT智能割草机器人全新系列正式开售
要闻 近日,科沃斯全新发布的GOAT A Series 和 GOAT O Series割草机器人,将在多国市场正式上市发售。作为业界最强的割草机器人产品之一,GOAT致力为割草机带来基于机器人视觉的专业定位解决方案。科沃斯GOAT全新系列产品全平台搭载地瓜机器人…...