当前位置: 首页 > news >正文

Rust ~ Vec<u8>和[u8]

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

类型本质

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

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

所有权和内存管理

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

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

创建方式

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

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

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

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

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

let arr = [1, 2, 3];
let slice: &[u8] = &arr;

let vec_bytes = vec![1, 2, 3];
let slice_from_vec: &[u8] = &vec_bytes;

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

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] 更合适。
例如,在函数中接收一个字节序列作为参数,而不关心该数据的来源和所有权。
切片可以避免不必要的内存复制,提高性能。在处理大数组或向量时,使用切片可以减少内存开销。

示例代码

// 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] 类型的参数,只是借用数据,不会获取所有权

相关文章:

  • Redis源码剖析之GEO——Redis是如何高效检索地理位置的?
  • Nginx+PHP+MYSQL-Ubuntu在线安装
  • Qt开发⑨Qt的事件_事件处理_按键事件和鼠标事件
  • 如何查找APP漏洞并渗透测试 解决网站被黑客攻击
  • BufferedReader PrintWriter
  • ctfhub-web信息泄露通关攻略
  • LabVIEW图像识别抗干扰分析
  • STM32学习【4】ARM汇编(够用)
  • 【Java项目】基于Spring Boot的校园闲置物品交易网站
  • IP 地址分配和管理全解析
  • 3 年→ 资深开发速通计划 序言
  • 5.10 P-Tuning v2:多层级提示编码的微调革新
  • pycharm编写ai大模型api调用程序及常见错误
  • [MD] AG stable
  • Autosar_RTE基础概念整理
  • 阿里云 | 快速在网站上增加一个AI助手
  • 【Stable Diffusion】AnimatedDiff--AI动画 插件使用技巧分享;文生视频、图生视频、AI生成视频工具;
  • python文件如何打包成.exe文件
  • 《AI和人工智能和编程日报》
  • nio中ByteBuffer使用
  • 十年磨一剑!上海科学家首次揭示宿主识别肠道菌群调控免疫新机制
  • 奥迪车加油时频繁“跳枪”维修两年未解决,4S店拒退换:可延长质保
  • 5吨煤炭“瞬间蒸发”?掺水炭致企业损失千万,腐败窝案曝光
  • 2025财政观察|长三角“三公”经费普降,钱要用在刀刃上
  • 外交部:中方对美芬太尼反制仍然有效
  • 国际能源署:全球电动汽车市场强劲增长,中国市场继续领跑