Rust標量、復合類型與自定義類型、第三方并發結構

以下是 Rust 中標量類型、對象類型(含結構體、復合類型、堆分配類型)以及常用第三方并發數據結構的完整分類、示例和區別對比,幫助你系統掌握它們的本質異同:


🟢 一、標量類型(Scalar Types,存儲于棧上)

標量是最基本的值類型,固定大小,存儲在棧上,實現 Copy,性能極高。

類別示例類型示例代碼特性說明
整數i8i128, u8u128, isize, usizelet x: u32 = 42;固定大小,快速拷貝
浮點數f32, f64let pi = 3.14;支持數學運算
布爾值boollet ok = true;二值邏輯
字符charlet c = '中';Unicode 字符,占 4 字節

🔹 特性總結:


🔵 無符號整數(以 u 開頭)

類型位寬數值范圍
u880 到 255
u16160 到 65,535
u32320 到 4,294,967,295
u6464更大的正整數范圍
u128128更大的正整數范圍(用于區塊鏈等)
usize平臺相關取決于系統架構(32 位或 64 位)

? 特點:


🔶 isizeusize 的特殊性


? 示例代碼:

fn main() {let a: i8 = -128;let b: u8 = 255;let c: i128 = 123456789012345678901234567890;let len: usize = 100;  // 通常用于索引數組let offset: isize = -5; // 通常用于指針偏移
}

如需更深入:我可以展示它們在內存中如何編碼(二進制補碼)、相互轉換規則、以及實際性能差異等。如果你做的是 MEV/區塊鏈相關項目,通常 u64, u128, usize 是常用的。需要我給出實際場景對比嗎?

  • 所有標量類型都實現了 Copy,默認按值傳遞;

  • 不涉及堆內存,無需手動釋放;

  • 適用于輕量邏輯、數學運算。

  • 這是 Rust 中的整數類型(標量類型)的一部分,它們的名字代表了它們的位數(bit 數)和符號性(有符號或無符號):


    🟢 一、整數類型命名規則說明

    類型名意義說明
    i有符號整數(signed)
    u無符號整數(unsigned)
    8/16/32/64/128占用的位數(bit)——8 位到 128 位
    isize/usize與平臺位寬一致(32 位系統就是 32 位)

    🟡 有符號整數(以 i 開頭)

    類型位寬數值范圍
    i88-128 到 127
    i1616-32,768 到 32,767
    i3232-2,147,483,648 到 2,147,483,647
    i6464極大范圍(用于大數運算)
    i128128更大范圍(例如加密算法中使用)
    isize平臺相關通常是 i32(32位)或 i64(64位)

    ? 特點:

  • 支持負數;

  • 二進制補碼表示;

  • 默認整型字面量如 let x = -1; 推導為 i32

  • 只能表示正整數;

  • 更節省空間(沒有負號位);

  • 常用于索引、地址、長度等不能為負的場景。

  • 它們與平臺架構有關:

    • 32 位系統:isize == i32usize == u32

    • 64 位系統:isize == i64usize == u64

  • 常用于內存相關操作(如數組索引、指針運算);

  • usize索引數組/切片的標準類型


🟡 二、復合類型與自定義類型(Struct、Enum、元組等,棧上或堆上混合)

這些類型通常在棧上保存其自身結構,但若包含如 StringVec 等堆分配成員,則這些成員的實際數據存儲在堆上,僅其指針或元數據位于棧上。


? 正確認解:

🟡 復合類型與自定義類型(Struct、Enum、元組等)可以存儲在棧上,也可以部分或全部在堆上,具體取決于其字段成員是否包含堆分配的類型(如 StringVecBox 等)


🔍 舉例說明:

? 全部在棧上(不包含堆分配類型):
struct Point {x: i32,y: i32,
}let p = Point { x: 1, y: 2 }; // 所有數據都在棧上
? 部分在堆上(包含堆分配字段):
struct User {name: String, // name 是堆分配的,變量 `name` 是個指針在棧上age: u32,
}let u = User {name: String::from("Alice"), // name 的數據在堆上age: 30,
};

🟡 User 整體在棧上,但 name 字段指向堆上數據,即“棧中字段為指向堆的地址”。


2.1 ? 結構體 Struct

struct User {name: String,age: u32,
}
  • 自定義字段類型;

  • 可實現方法和 trait;

  • 支持所有權語義、構造、匹配等。


2.2 ? 元組(Tuple)

let t: (i32, f64, bool) = (1, 2.0, true);
  • 支持混合類型組合;

  • 若內部元素都是 Copy,整個元組可 Copy


2.3 ? 數組(Array)與切片(Slice)

let arr: [i32; 3] = [1, 2, 3];
let slice: &[i32] = &arr[1..];
  • 數組固定長度,棧上存儲;

  • 切片為引用類型,動態大小(DST 類型)。


2.4 ? 字符串類型

let s: String = String::from("hello");
let s_ref: &str = "hello";
  • String: 堆分配,可變;

  • &str: 字符串切片,通常是靜態數據。


2.5 ? Vec

let v = vec![1, 2, 3];
  • 堆分配的動態數組;

  • 支持 push/pop;

  • 不可 Copy,可 Clone


2.6 ? HashMap<K, V>

use std::collections::HashMap;
let mut map = HashMap::new();
map.insert("key", 42);
  • 基于哈希的鍵值對集合;

  • 可變、堆上存儲;

  • 單線程版本。


2.7 ? 枚舉類型(Enum)

enum Status {Success,Error(String),
}
  • 有限狀態封裝;

  • 多用于 Result, Option

  • 有時也用于表達狀態機。


2.8 ? 智能指針:Box、Rc、Arc

let b = Box::new(5); // 堆分配單個值
let rc = Rc::new(vec![1,2]); // 引用計數,單線程
let arc = Arc::new("safe"); // 原子引用計數,多線程
  • 實現堆分配、共享、引用計數;

  • 非 Copy,擁有所有權邏輯。


🔵 三、常見第三方并發對象類型

這些是非標庫中提供的“線程安全復合對象”,廣泛用于高并發項目:

3.1 ? DashMap

use dashmap::DashMap;
let map = DashMap::new();
map.insert("addr", 100);
  • 并發 HashMap,內部分段鎖;

  • 多線程讀寫無阻塞;

  • 替代 Mutex<HashMap>


3.2 ? Tokio::RwLock / Mutex

use tokio::sync::RwLock;
let data = RwLock::new(42);
  • async 版本讀寫鎖;

  • 適合異步場景共享數據。


3.3 ? crossbeam::channel / deque / queue

use crossbeam::channel::unbounded;
let (s, r) = unbounded();
  • 高性能無鎖消息傳遞;

  • 多線程任務協調。


3.4 ? parking_lot::Mutex / RwLock

use parking_lot::Mutex;
let m = Mutex::new(0);
  • 更輕量的同步原語;

  • 替代標準庫的同步結構。


🔴 四、差異對比總結表

類型是否標量是否對象是否堆上是否 Copy多線程安全是否動態大小示例
i32, bool?????(本地)?let x = 1;
String??????String::from()
Vec<T>??????vec![1,2]
struct???/????/?自定義結構體
Box<T>??????Box::new()
Rc<T>?????(非線程)?Rc::new()
Arc<T>??????Arc::new()
DashMap??????DashMap::new()
Tokio::RwLock?????(異步)?異步共享鎖

? 總結記憶法:

類型用途是否“對象”
標量類型控制流、計算、棧數據?
結構體/枚舉/元組組織數據結構,自定義模型?
String, Vec動態數據,堆分配?
DashMap 等并發結構并發環境下的共享/協同?(復合對象)

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

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

相關文章

基于STM32溫濕度檢測—串口顯示

基于STM32溫濕度檢測 &#xff08;仿真&#xff0b;程序&#xff09; 功能介紹 具體功能&#xff1a; 1.使用DHT11檢測溫濕度&#xff1b; 2.單片機處理完控制LCD1602顯示溫濕度&#xff1b; 3.單片機也通過串口顯示檢測到的溫濕度&#xff1b; 添加圖片注釋&#xff0c;不…

Windows 10 查詢 Nginx 進程教程

1. 打開命令提示符&#xff08;CMD&#xff09; 按 Win R&#xff0c;輸入 cmd&#xff0c;回車。或者在開始菜單搜索欄輸入“cmd”&#xff0c;選擇“命令提示符”。 2. 查看是否有正在運行的 Nginx 進程 輸入命令&#xff1a; tasklist | findstr nginx這個命令會列出所有…

使用 Kafka 優化物流系統的實踐與思考

使用 Kafka 優化物流系統的實踐與思考 在現代物流系統中&#xff0c;訂單處理、倉儲管理、運輸調度等環節復雜且實時性要求高。為了滿足異步解耦、高吞吐、高可用、事件驅動和數據可靠性等需求&#xff0c;Kafka 作為分布式消息隊列和流處理平臺&#xff0c;成為了我們的首選。…

Rust中模式匹配let Some(gas_price) = tx.gas_price用法

你問得非常好&#xff0c;let Some(gas_price) tx.gas_price 是 Rust 中的一種模式匹配寫法&#xff0c;它用于從 Option 類型中提取值。 ? 背景知識&#xff1a;什么是 Option&#xff1f; 在 Rust 中&#xff0c;如果一個值可能存在也可能不存在&#xff0c;就會用 Option…

什么是LLM大語言模型

什么是LLM大語言模型 LLM的全稱是&#xff0c;Large Language Model&#xff0c;簡稱LLM&#xff0c;翻譯為大語言模型&#xff0c;其核心是模擬人類語言的復雜規律&#xff0c;實現語義理解、推理分析、文本生成等任務&#xff0c;主要目的是實現能讀懂和說出人類語言的模型。…

雜談-架構時代演進

關于未來 5-10 年軟件系統演化方向 1. 云原生 ? 超云原生&#xff08;Post Cloud Native&#xff09; Kubernetes 平臺自治化&#xff1a; K8s Operator 日益強大&#xff0c;逐步具備自愈、自動擴縮容、自動調優能力。 云廠商與企業私有云逐步融合為一體…

如何查看服務器的運行日志?

&#x1f7e2; 一、Linux服務器 Linux日志都在**/var/log**目錄下&#xff0c;最常用的有&#xff1a; &#x1f4c2; 常用日志文件 文件內容/var/log/messages大部分系統日志&#xff08;CentOS常見&#xff09;/var/log/syslog系統消息日志&#xff08;Ubuntu/Debian常見&a…

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫

在幸狐RV1106開發板上用gcc14.2本地編譯安裝postgresql 17.5數據庫 編譯環境&#xff1a; RV1106G3 Linux luckfox-rv1106 5.10.160 #3 Fri Jun 27 14:16:20 AWST 2025 armv7l GNU/Linux BusyBox v1.36.1 gcc version 14.2.0 (GCC) GNU ld (GNU Binutils) 2.44 GNU Make 4.4 n…

Go語言中map[string]interface{} 和 map[string]string的區別

在 Go 語言中&#xff0c;map[string]interface{} 和 map[string]string 是兩種不同類型的 map&#xff0c;它們的主要區別在于值的類型以及這種差異帶來的使用場景和靈活性的不同。 1. 值的類型 map[string]interface{}&#xff1a;這里的 interface{} 表示 Go 中的空接口類型…

AdGuard Home 安裝及使用

AdGuard Home 是 AdGuard 開源的一個私人 DNS 服務端,只需在網關部署,即可實現全局域網的廣告攔截與隱私反追蹤。在 DNS 解析的過程中,匹配規則庫內的 URL 進行攔截,同時在客戶端中,還可以通過自定義過濾規則實現網頁 DOM 的攔截。 基于 Golang 編寫的 AdGuard Home,官方…

繞過 GraphQL 暴力破解保護

題目要求&#xff1a; 本實驗的用戶登錄機制由 GraphQL API 提供支持。API 終端節點有一個速率限制器&#xff0c;如果它在短時間內收到來自同一源的太多請求&#xff0c;則會返回錯誤。 要解決實驗問題&#xff0c;請暴力破解登錄機制以 .使用身份驗證實驗室密碼列表作為密碼…

C/C++ 使用rapidjson庫 操作Json格式文件(創建、插入、解析、修改、刪除)

目錄 一、前言 1.簡介 2.兼容性 3.下載 4.安裝 5.官方文檔 6.自述 二、封裝Json 1. 創建一個 Document 對象 2. "key":"value" 3. { } 4. [ ] 5. [ { }, { } ] 6. [ [ ], [ ] ] 7. { [ ], [ ] } 8. { { }, { } } 9. 將Document轉換為字符串…

免安裝一鍵修復網絡診斷 + 權限修復!打印機共享錯誤工具適配 Win7/10/11

各位打印小能手們&#xff01;你們有沒有遇到過共享打印機出問題&#xff0c;搞得自己焦頭爛額的情況&#xff1f;比如系統一更新&#xff0c;打印機就連不上&#xff0c;打印任務失敗&#xff0c;真的是讓人崩潰啊&#xff01;別慌&#xff0c;今天就給大家全面介紹一款打印機…

電腦分屏快捷鍵5

按window右箭頭&#xff1a; 按window左箭頭&#xff1a;

nt!CcFlushCache函數分析之nt!CcFindBcb

nt!CcFindBcb函數分析 第一部分&#xff1a; 1: kd> p nt!CcAcquireByteRangeForWrite0x377: 80a13c49 e866e4ffff call nt!CcFindBcb (80a120b4) 1: kd> t nt!CcFindBcb: 80a120b4 55 push ebp 1: kd> kc # 00 nt!CcFindBcb 01 nt!CcAcqu…

矩陣及矩陣快速冪

一.矩陣與模板 【模板】矩陣求和 時間限制&#xff1a;1秒 內存限制&#xff1a;128M 題目描述 給出兩個&#x1d45b;行&#x1d45a;列的矩陣&#xff0c;求兩個矩陣的和 輸入描述 第一行輸入兩個以空格分隔的整數&#x1d45b;,&#x1d45a;&#xff0c;表示矩…

rk3588獲取探維雷達數據

可以在上期部署完 FASTLIO 的工作空間內&#xff0c;繼續部署探維雷達的驅動程序。不要問為什么不用 mid360&#xff0c;因為我手上只有探維雷達。 探維雷達的驅動鏈接&#xff1a;https://github.com/TanwayLab/tanwaylidar_view/blob/main/README.md 下載驅動并編譯 因為沿…

HTML簡介,初步了解HTML

<html> <body> <h1>我的第一個標題</h1> <p1>我的第一個段落</p1> </body> </html> 什么是HTML HTML是用來描述網頁的一種語言。 HTML指的是超文本標記語言。 HTML不是一種編程語言&#xff0c;而是一種標記語言。 標記語…

ARM集群服務器 定義

ARM集群服務器的核心定義可歸納為以下要點&#xff1a; 一、核心定義 ARM集群服務器是將?多個基于ARM架構的處理器節點?集成在單一物理機箱內&#xff0c;通過高速網絡互聯形成的分布式計算系統。每個節點均具備獨立的計算單元&#xff08;如CPU、GPU/NPU&#xff09;、內存…

進程和線程的區別?

進程&#xff08;Process&#xff09;和線程&#xff08;Thread&#xff09;是操作系統資源分配和調度的核心概念&#xff0c;它們的區別主要體現在以下幾個方面&#xff1a; 1. ??定義與資源分配?? ??進程?? 是程序的??一次執行實例??&#xff0c;擁有獨立的地址空…