Rust进阶[part1]_智能指针概述&box指针

智能指针概述

在Rust中,智能指针是一类特殊的数据结构,它们不仅像普通指针一样可以引用数据,还带有额外的元数据和功能。与普通指针不同,智能指针通常使用结构体实现,并且会实现 DerefDrop 等特定的trait,以提供更强大的功能和更安全的内存管理。

智能指针在Rust编程中扮演着重要的角色,它们能够帮助开发者处理复杂的内存管理场景,确保程序的安全性和性能。例如,在处理动态大小的数据、递归数据结构或者需要自定义资源释放逻辑时,智能指针就显得尤为重要。

Box指针

内存分配到堆上

在Rust中,栈内存的分配和释放是自动且高效的,但栈空间是有限的。对于一些大型的数据结构或者需要在运行时动态确定大小的数据,将其存储在栈上可能会导致栈溢出。这时,我们可以使用 Box 指针将数据分配到堆上。

Box 是Rust标准库中最基本的智能指针之一,它允许我们在堆上分配内存,并将数据存储在其中。通过 Box 指针,我们可以在栈上存储一个指向堆上数据的引用,从而实现对堆上数据的访问。

以下是一个简单的示例,展示了如何使用 Box 将一个整数分配到堆上:

fn main() {let boxed_int = Box::new(42);println!("The value inside the box is: {}", *boxed_int);
}

在这个示例中,Box::new(42) 创建了一个 Box 指针,它指向堆上存储的整数 42

通过解引用运算符 *,我们可以访问堆上的数据。

允许处理动态大小类型(DST)

Rust中的动态大小类型(DST)是指在编译时无法确定大小的数据类型,例如切片([T])和特征对象(dyn Trait)。

由于栈上的内存分配需要在编译时确定大小,因此无法直接将DST存储在栈上。而 Box 指针可以用于存储DST,因为它会在堆上分配内存,从而避免了栈上内存分配的限制。

以下是一个使用 Box 存储切片的示例:

fn main() {let slice: &[i32] = &[1, 2, 3];let boxed_slice: Box<[i32]> = Box::from(slice);println!("The boxed slice contains: {:?}", boxed_slice);
}

在这个示例中,我们首先创建了一个切片 slice,然后使用 Box::from 方法将其转换为 Box<[i32]> 类型,从而将切片存储在堆上。

// 允许处理动态大小类型,比如结构体和元组let boxed_tuple = Box::new((String::from("hello"), 5));println!("Boxed tuple: {:?}", boxed_tuple);

递归数据结构

递归数据结构是指包含自身类型的成员的结构体或枚举。由于递归数据结构的大小在编译时无法确定,因此无法直接将其存储在栈上。Box 指针可以用于解决这个问题,通过在递归数据结构中使用 Box 指针,我们可以将递归成员存储在堆上,从而避免栈溢出的问题。

以下是一个使用 Box 实现链表节点的示例:

#[derive(Debug)]
enum List {Cons(i32, Box<List>),Nil,
}fn main() {let list = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil))));println!("The list is: {:?}", list);
}

在这个示例中,List 枚举表示一个链表,其中 Cons 变体包含一个整数和一个指向另一个 List 节点的 Box 指针。通过使用 Box 指针,我们可以创建一个递归的链表结构。

类型擦除

类型擦除是指在编译时隐藏具体的类型信息,只保留类型的共性。在Rust中,我们可以使用 Box<dyn Trait> 来实现类型擦除。Box<dyn Trait> 是一个特征对象,它可以存储任何实现了指定特征的类型的值。

以下是一个使用 Box<dyn Trait> 实现类型擦除的示例:

trait Draw {fn draw(&self);
}struct Circle;
impl Draw for Circle {fn draw(&self) {println!("Drawing a circle");}
}struct Square;
impl Draw for Square {fn draw(&self) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91622.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91622.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91622.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++扩展 --- 并发支持库(补充1)

C扩展 --- 并发支持库&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/149606406?fromshareblogdetail&sharetypeblogdetail&sharerId149606406&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link atom…

在Three.js中导入和添加自定义网格的最佳实践 - 综合指南

探索在Three.js中导入和添加自定义网格的最佳实践。本指南涵盖增强 3D 项目的技术、技巧和实际示例。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 强烈建议使用 GLTF 格式来集成 3D 几何体&#xff0c;提供简化的流程&#xff0c;并固有地支持动画、…

Redis知识点(1)

目录 Redis Redis和MySQL的区别 Redis的高可用方案 Redis可以用来做什么 Redis的数据类型 字符串 列表 哈希 集合 有序集合 Bitmap Redis为什么快呢&#xff1f; I/O多路复用 说说select,poll,epoll,kqueue,IOCP的区别 Redis为什么早期选择单线程&#xff1f; …

使用iptables封禁恶意ip异常请求

查看后端日志发现一IP&#xff08;103.76.250.29&#xff09;频繁请求不存在的资源路径​​&#xff08;如 /api/v1/guest/comm/config、/theme/default/assets/compoments.js 等&#xff09;&#xff0c;并伴随对根路径 / 的正常访问。这种行为的可能性包括恶意扫描、自动化工…

BehaviorTree.Ros2 编译教程

1. 源码下载 git clone https://github.com/BehaviorTree/BehaviorTree.ROS2.git2. 编译过程 源码中有3个项目: btcpp_ros2_interfacesbtcpp_ros2_interfacesbtcpp_ros2_samples 2.1 编译btcpp_ros2_interfaces: colcon --packages-select btcpp_ros2_interfaces2.2 编译 …

AR智能巡检系统:制造业设备管理的效率革新

随着工业4.0和数字化转型的加速&#xff0c;设备管理在制造业、能源、交通等关键领域的重要性愈发凸显。传统设备巡检依赖人工记录和纸质报告&#xff0c;不仅效率低下&#xff0c;还容易因人为疏忽导致数据错误或安全隐患。然而&#xff0c;增强现实&#xff08;AR www.teamhe…

破解海外仓客户响应难题:自动化系统是关键

在跨境电商蓬勃发展的当下&#xff0c;海外仓作为连接卖家与终端消费者的重要枢纽&#xff0c;其服务效率直接影响着卖家的运营成果。其中&#xff0c;即时客户响应一直是行业痛点&#xff0c;尤其对中小型海外仓而言&#xff0c;单纯依靠人力维持全天候服务意味着高昂的成本压…

PyTorch基础——张量计算

文章目录PyTorch基础——张量计算1 什么是张量计算&#xff1f;2 基本算术运算2.1 加法运算2.1.2 torch.add2.1.3 a.add(b) 与 a.add_(b)a.add(b) 方法a.add_(b) 方法核心区别2.2 减法运算2.2.1 toch.sub()2.2.2 a.sub(b) 和a.sub_(b)a.sub(b) 方法a.sub_(b) 方法核心区别使用建…

云原生联调利器:Telepresence实战

Telepresence在云原生联调中的应用&#xff1a;本地服务直连K8s集群实战在云原生开发中&#xff0c;调试和测试服务常常需要本地环境与远程Kubernetes&#xff08;K8s&#xff09;集群无缝集成。Telepresence是一个开源工具&#xff0c;它允许开发者将本地服务“注入”到K8s集群…

浏览器【详解】requestIdleCallback(浏览器空闲时执行)

简介requestIdleCallback 是浏览器的一个 API&#xff0c;用于在浏览器空闲时间执行低优先级任务&#xff0c;避免阻塞主线程&#xff0c;提升页面性能和响应速度。 当浏览器完成了关键任务&#xff08;如渲染、布局、用户交互处理&#xff09;且暂时没有更高优先级的工作时&am…

STP技术

一、环路的危害1.现象链路指示灯快速闪烁MAC表震荡&#xff1a;交换机频繁修改MAC地址表 → 转发失效。2.环路危害造成的影响链路堵塞主机操作系统响应迟缓二层交换机管理缓慢冲击网关设备的CPU三、STP的作用1.STP基本原理STP即生成树协议&#xff0c;它通过阻断冗余链路来消除…

RAGFLOW~knowledge graph

start 为了增强多跳问答&#xff0c;RAGFlow在数据提取和索引之间增加了一个知识图谱构建步骤&#xff0c;如下面所示。这一步骤会从您指定的分块方法生成的现有块中创建额外的块。 从v0.16.0版本开始&#xff0c;RAGFlow支持在知识库上构建知识图谱&#xff0c;允许你在知识库…

机器学习【二】KNN

KNN算法是一种基于实例的惰性学习算法&#xff0c;其核心思想是通过"多数投票"机制进行分类决策。算法流程包括数据准备&#xff08;需归一化处理&#xff09;、距离计算&#xff08;常用欧氏距离&#xff09;、选择K值&#xff08;通过交叉验证确定&#xff09;和决…

preloader

patch调试串口115200--- a/platform/ac8257/default.makb/platform/ac8257/default.mak-40,7 40,7 CFG_USB_DOWNLOAD :1CFG_FUNCTION_PICACHU_SUPPORT :1CFG_PMT_SUPPORT :0CFG_UART_COMMON :1 -CFG_LOG_BAUDRATE :921600 CFG_LOG_BAUDRATE :115200CFG_EVB_UART_CLOCK :260000…

Linux基础(三)——Bash基础

1、Bash基础1.1 Bash简介从前边操作系统的组成介绍中&#xff0c;我们可以知道操作系统为上层用户提供的与内核进行交互的接口称为shell&#xff0c;其在系统中的位置如下图所示&#xff0c;shell作为内核和用户之间的中介&#xff0c;接收用户发送的指令&#xff0c;将其解析为…

Python 元编程实战:动态属性与数据结构转换技巧

在处理复杂嵌套的 JSON 数据源时&#xff0c;我们常面临访问不便、结构不灵活、字段关联性差等问题。本文将以 O’Reilly 为 OSCON 2014 提供的 JSON 数据源为例&#xff0c;系统讲解如何通过 动态属性转换、对象封装、数据库映射与特性&#xff08;property&#xff09;机制&a…

Android-侧边导航栏的使用

在学习之前&#xff0c;我们先得知道侧边导航栏是什么&#xff1f;它是一个 可以让内容从屏幕边缘滑出的布局容器&#xff0c;由安卓官方提供&#xff0c;用于创建侧边菜单&#xff0c;通常搭配 NavigationView 使用&#xff1b;添加依赖&#xff1a;在app下的build.gradle中添…

lesson30:Python迭代三剑客:可迭代对象、迭代器与生成器深度解析

目录 一、可迭代对象&#xff1a;迭代的起点 可迭代对象的本质特征 可迭代对象的工作原理 自定义可迭代对象 二、迭代器&#xff1a;状态化的迭代工具 迭代器协议与核心方法 迭代器的状态管理 内置迭代器的应用 三、生成器&#xff1a;简洁高效的迭代器 生成器函数&a…

实时语音流分段识别技术解析:基于WebRTC VAD的智能分割策略

引言 在现代语音识别应用中&#xff0c;实时处理音频流是一项关键技术挑战。不同于传统的文件式语音识别&#xff0c;流式处理需要面对音频数据的不确定性、网络延迟以及实时性要求等问题。本文将深入解析一个基于WebRTC VAD&#xff08;Voice Activity Detection&#xff09;…

word中rtf格式介绍

RTF&#xff08;Rich Text Format&#xff0c;富文本格式&#xff09;是一种由微软开发的跨平台文档文件格式&#xff0c;用于在不同应用程序和操作系统之间交换格式化文本。以下是对RTF格式的简要说明&#xff1a; RTF格式特点 跨平台兼容性&#xff1a;RTF文件可以在多种文字…