Rust ~ Vec<u8>和[u8]

server/2025/3/1 5:19:24/

Vec<u8>&[u8] 是两种不同的数据类型,它们都与字节序列相关,但在所有权、内存管理、使用场景等方面存在明显区别

类型本质

Vec<u8>:Rust 中的动态数组类型,即向量(vector)。它是一个拥有所有权的可增长的字节缓冲区,在堆上分配内存来存储元素。可以改变其长度,支持添加、删除和修改元素等操作

&[u8]:切片(slice)类型,它是对一个连续内存区域的引用,通常是对数组或向量的部分或全部元素的引用。切片本身并不拥有数据,它只是一个视图,指向其他数据的一部分。

所有权和内存管理

Vec<u8>
拥有其存储的字节数据的所有权。当 Vec<u8> 离开作用域时,它所占用的内存会被自动释放
可以通过 push、pop 等方法动态地改变其大小,在需要时会自动进行内存的重新分配

&[u8]
不拥有数据的所有权,只是对已有数据的借用。它只是一个指向数据的指针和一个长度信息,不负责内存的分配和释放
切片的生命周期取决于它所引用的数据的生命周期,只要所引用的数据存在,切片就可以安全使用

创建方式

Vec<u8>
可以使用 vec! 宏来创建:

rust">let vec_bytes: Vec<u8> = vec![1, 2, 3];

也可以使用 Vec::new() 方法创建一个空的向量,然后通过 push 方法添加元素:

rust">let mut vec_bytes = Vec::new();
vec_bytes.push(1);
vec_bytes.push(2);
vec_bytes.push(3);

&[u8]
可以从数组或向量中创建切片:

rust">let arr = [1, 2, 3];
let slice: &[u8] = &arr;let vec_bytes = vec![1, 2, 3];
let slice_from_vec: &[u8] = &vec_bytes;

还可以使用范围语法来创建部分切片:

rust">let vec_bytes = vec![5, 4, 3, 2];
let partial_slice: &[u8] = &vec_bytes[1..3]; // 左开右闭区间,包含索引 1 和 2 的元素,即4、3

使用场景

Vec<u8>
当需要动态地存储和管理字节数据,并且需要改变数据的大小时,使用 Vec<u8> 是合适的。例如,在读取文件或网络数据时,由于数据量可能不确定,使用 Vec<u8> 可以方便地进行数据的追加。
当需要将数据的所有权转移给其他函数或对象时,也可以使用 Vec<u8>

&[u8]
当只需要对已有的字节数据进行只读访问,而不需要拥有数据的所有权时,使用 &[u8] 更合适。
例如,在函数中接收一个字节序列作为参数,而不关心该数据的来源和所有权。
切片可以避免不必要的内存复制,提高性能。在处理大数组或向量时,使用切片可以减少内存开销。

示例代码

rust">// Vec<u8> 示例
fn process_vec(mut vec_bytes: Vec<u8>) {vec_bytes.push(4);println!("Vec bytes: {:?}", vec_bytes);
}// &[u8] 示例
fn process_slice(slice: &[u8]) {println!("Slice bytes: {:?}", slice);
}fn main() {let mut vec_bytes = vec![1, 2, 3];process_vec(vec_bytes); // 所有权转移let arr = [1, 2, 3];let slice = &arr;process_slice(slice); // 借用数据
}

process_vec 函数接收一个 Vec<u8> 类型的参数,会获取数据的所有权
process_slice 函数接收一个 &[u8] 类型的参数,只是借用数据,不会获取所有权


http://www.ppmy.cn/server/171473.html

相关文章

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…

Python的PyTorch+CNN深度学习技术在人脸识别项目中的应用

人脸识别技术是一种基于人脸特征进行身份识别的生物识别技术&#xff0c;其核心原理包括人脸检测、人脸对齐、特征提取、特征匹配、身份识别。 一、应用场景 安防&#xff1a;门禁、监控。 金融&#xff1a;刷脸支付、身份验证。 社交&#xff1a;自动标注、美颜。 医疗&am…

深入解析:使用Python爬虫获取京东商品详情原数据API接口

在电商数据分析、竞品研究以及用户体验优化等领域&#xff0c;获取商品详情数据是至关重要的一步。京东作为国内领先的电商平台&#xff0c;提供了丰富的API接口供开发者使用。本文将详细介绍如何通过Python爬虫技术调用京东商品详情API接口&#xff0c;获取商品的原数据&#…

【Day48 LeetCode】图论问题 Ⅵ

一、图论问题 Ⅵ 1、拓扑排序–软件构建 拓扑排序是将一个有向图转成线性的排序&#xff0c;需要判断有向图中是否存在环。这个比较经典的问题就是leetcode里207 课程表。和这题异曲同工。 思路就是&#xff1a;记录每个节点的入度&#xff0c;以及当前节点的下一个节点。优先…

java23种设计模式-策略模式

策略模式(Strategy Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 🌟 模式定义 策略模式是一种行为型设计模式,…

echarts 环形图 指定区域从右侧中心点展开

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>ECharts 环形图不合理区域展示<…

IP-----动态路由OSPF

这只是IP的其中一块内容&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为GRE和MGRE &#xff0c;可通过以下路径查看IP-------GRE和MGRE-CSDN博客,欢迎指正 注意&#xff01;&#xff01;&#xff01;本部分内容较多所以分成了两部分在下一章 5.动态路由OS…

如何免费使用稳定的deepseek

0、背景&#xff1a; 在AI辅助工作中&#xff0c;除了使用cursor做编程外&#xff0c;使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1&#xff0c;也给了自己不少启示。但是由于官网稳定性很差&#xff0c;很多…