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] 類型的參數,只是借用數據,不會獲取所有權

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72004.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MYSQL學習筆記(十):約束介紹(如:非空、唯一、主鍵、外鍵、級聯、默認、檢查約束)

前言&#xff1a; 學習和使用數據庫可以說是程序員必須具備能力&#xff0c;這里將更新關于MYSQL的使用講解&#xff0c;大概應該會更新30篇&#xff0c;涵蓋入門、進階、高級(一些原理分析);這一篇講解“約束”&#xff0c;如&#xff1a;非空、唯一、主鍵、外鍵、級聯、默認…

樹莓百度百科更新!宜賓園區業務再添新篇

樹莓集團宜賓園區業務不斷拓展&#xff0c;主要體現在以下幾個方面&#xff1a; 產業布局 -聚焦數字經濟核心領域&#xff1a;涵蓋軟件開發、人工智能、大數據等&#xff0c;吸引眾多上下游企業入駐&#xff0c;形成從芯片研發、軟件開發到系統集成的完整產業鏈條。 -推進“雙…

Halcon 學習之路 set_grayval 算子

gen_imag_const 創建灰度圖像 gen_image_const(Image&#xff0c;Type&#xff0c;Width&#xff0c;Height) 算子gen_image_const創建指定大小的圖像&#xff0c;圖像的寬度和高度由Width和Height決定 Type 像素類型 byte :每像素1字節&#xff0c;無符號&#xff08;0-255&…

03_pyqt5 + vlc 實現視頻播放器

1.功能需求如圖 按鈕: 播放/暫停, 前進/后退, 視頻上一個/下一個, 打開視頻進度條: 視頻進度條顯示, 進度條拖拽, 音量控制按鍵控制: 1,2,3,4縮放畫面大小, 2.方案選擇 開發語言: python UI界面: pyqt5 qt_designed 設計ui布局 視頻編碼: python-vlc 方案說明: 視頻解碼可…

使用vscode導出Markdown的PDF無法顯示數學公式的問題

我的硬件環境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF來導出md文件對應的PDF。但不管導出html還是PDF文件&#xff0c;數學公式都是顯示的源代碼。 我看了許多教程&#xff0c;給的是這個方法&#xff1a;在md文件對應的html文件中加上以下代碼&#xff1a…

Java 網絡編程(二)—— TCP流套接字編程

TCP 和 UDP 的區別 在傳輸層&#xff0c;TCP 協議是有連接的&#xff0c;可靠傳輸&#xff0c;面向字節流&#xff0c;全雙工 而UDP 協議是無連接的&#xff0c;不可靠傳輸&#xff0c;面向數據報&#xff0c;全雙工 有連接和無連接的區別是在進行網絡通信的時候&#xff0c;…

MySQL 事務筆記

MySQL 事務筆記 目錄 事務簡介事務操作事務四大特性并發事務問題事務隔離級別總結 事務簡介 事務&#xff08;Transaction&#xff09;是數據庫操作的邏輯單元&#xff0c;由一組不可分割的SQL操作組成。主要用于保證&#xff1a; 多個操作的原子性&#xff08;要么全部成功…

GPT1 與 GPT2 的異同

1.什么是GPT1&#xff1a; GPT1介紹了一種通過生成式預訓練&#xff08;Generative Pre-Training&#xff09;來提升語言理解能力的方法。這種方法首先在一個大型的未標注文本語料庫上進行語言模型的預訓練&#xff0c;然后針對具體的任務進行判別式微調&#xff08;discrimin…

Android Audio其他——數字音頻接口(附)

數字音頻接口 DAI,即 Digital Audio Interfaces,顧名思義,DAI 表示在板級或板間傳輸數字音頻信號的方式。相比于模擬接口,數字音頻接口抗干擾能力更強,硬件設計簡單,DAI 在音頻電路設計中得到越來越廣泛的應用。 一、音頻鏈路 1、模擬音頻信號 可以看到在傳統的…

kafka-leader -1問題解決

一. 問題&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分區的領導者副本尚未被選舉出來&#xff0c;或者在獲取領導者信息時出現了問題。以下是可能導致出現 kafka leader -1 的一些常見原因及相關分析&#xff1a; 1. 副本同步問題&#xff1a; 在 Kafka 集群中&…

DeepSeek基礎之機器學習

文章目錄 一、核心概念總結&#xff08;一&#xff09;機器學習基本定義&#xff08;二&#xff09;基本術語&#xff08;三&#xff09;假設空間&#xff08;四&#xff09;歸納偏好&#xff08;五&#xff09;“沒有免費的午餐”定理&#xff08;NFL 定理&#xff09; 二、重…

【jira】用到幾張表

jira用到的幾張表 測試計劃&#xff0c;測試周期&#xff0c;測試用例&#xff0c;問題記錄 1. 測試計劃 # 記錄表&#xff0c;查計劃詳情 SELECT ID,issuenum,SUMMARY FROM jiraissue where issuenum 22871# 測試計劃下&#xff0c;測試周期&#xff0c;查測試周期id&…

Mysql 死鎖場景及解決方案

一、常見死鎖場景 1. 不同順序的鎖獲取 場景&#xff1a;事務A按順序更新 行1 → 行2&#xff0c;事務B按 行2 → 行1 順序更新。 原因&#xff1a;雙方各持有一把鎖&#xff0c;同時請求對方持有的鎖&#xff0c;形成循環等待。 2. 索引缺失導致鎖升級 場景&#xff1a;更…

Spring Boot從入門到精通:一站式掌握企業級開發

前言 Spring Boot作為Java領域最流行的微服務框架&#xff0c;憑借其約定優于配置的理念和快速啟動的特性&#xff0c;極大簡化了Spring應用的初始搭建和開發過程。本文將帶你從零開始系統學習Spring Boot&#xff0c;最終實現精通級應用開發&#xff0c;涵蓋核心原理、實戰技…

【Go】十六、protobuf構建基礎服務信息、grpc服務啟動的基礎信息

商品服務 服務結構 創建 goods 服務&#xff0c;將之前 user 服務的基本結構遷移到 goods 服務上&#xff0c;完整目錄是&#xff1a; mxshop_srvs user_srv … tmp … goods_srv config config.go 配置的讀取表 global global.go 數據庫、日志初始化、全局變量定義 handler …

Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)

本部分內容是關于博主在學習 Redis 時關于持久化部分的記錄&#xff0c;介紹了 RDB 和 AOF 兩種持久化方式&#xff0c;詳細介紹了持久化的原理、配置、使用方式、優缺點和使用場景。并對兩種持久化方式做了對比。文章最后介紹了 Redis 持久化的意義并與其他常見的緩存技術做了…

Linux中lshw相關的命令

? lshw&#xff08;List Hardware&#xff09;是一個在 Linux 系統中用于顯示硬件詳細信息的強大工具。以下是一些常見的 lshw 相關命令及其用法&#xff1a; 1. 安裝 lshw 在使用 lshw 之前&#xff0c;你可能需要先安裝它。不同的 Linux 發行版安裝方式有所不同&#xff1…

爬蟲第九篇-結束爬蟲循環

最近在學習Python爬蟲的過程中&#xff0c;遇到了一個很有趣的問題&#xff1a;如何優雅地結束爬蟲循環&#xff1f;今天&#xff0c;我想和大家分享一下我的發現和心得。 一、爬蟲循環結束的常見問題 在寫爬蟲時&#xff0c;我們經常會遇到這樣的情況&#xff1a;當爬取到的…

Vue3狀態管理新選擇:Pinia使用完全指南

一、為什么需要狀態管理&#xff1f; 在Vue應用開發中&#xff0c;當我們的組件樹變得復雜時&#xff0c;組件間的數據傳遞會成為棘手的問題。傳統方案&#xff08;如props/$emit&#xff09;在多層嵌套組件中會變得笨拙&#xff0c;這時狀態管理工具應運而生。Vue3帶來了全新…

一文掌握模擬登錄的基本原理和實戰

文章目錄 1. 模擬登錄的基本原理1.1 登錄流程1.2 關鍵技術2. 模擬登錄的實戰步驟2.1 分析登錄頁面2.2 使用 Requests 實現模擬登錄2.3 處理驗證碼2.4 使用 Selenium 實現模擬登錄3. 實戰案例:模擬登錄豆瓣3.1 分析豆瓣登錄頁面3.2 實現代碼4. 注意事項5. 總結模擬登錄是爬蟲開…