以下是 Rust 中標量類型、對象類型(含結構體、復合類型、堆分配類型)以及常用第三方并發數據結構的完整分類、示例和區別對比,幫助你系統掌握它們的本質異同:
🟢 一、標量類型(Scalar Types,存儲于棧上)
標量是最基本的值類型,固定大小,存儲在棧上,實現 Copy
,性能極高。
類別 | 示例類型 | 示例代碼 | 特性說明 |
---|---|---|---|
整數 | i8 i128 , u8 u128 , isize , usize | let x: u32 = 42; | 固定大小,快速拷貝 |
浮點數 | f32 , f64 | let pi = 3.14; | 支持數學運算 |
布爾值 | bool | let ok = true; | 二值邏輯 |
字符 | char | let c = '中'; | Unicode 字符,占 4 字節 |
🔹 特性總結:
🔵 無符號整數(以 u
開頭)
類型 | 位寬 | 數值范圍 |
---|---|---|
u8 | 8 | 0 到 255 |
u16 | 16 | 0 到 65,535 |
u32 | 32 | 0 到 4,294,967,295 |
u64 | 64 | 更大的正整數范圍 |
u128 | 128 | 更大的正整數范圍(用于區塊鏈等) |
usize | 平臺相關 | 取決于系統架構(32 位或 64 位) |
? 特點:
🔶 isize
和 usize
的特殊性
? 示例代碼:
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
開頭)類型 位寬 數值范圍 i8
8 -128 到 127 i16
16 -32,768 到 32,767 i32
32 -2,147,483,648 到 2,147,483,647 i64
64 極大范圍(用于大數運算) i128
128 更大范圍(例如加密算法中使用) isize
平臺相關 通常是 i32
(32位)或i64
(64位)? 特點:
-
支持負數;
-
二進制補碼表示;
-
默認整型字面量如
let x = -1;
推導為i32
。 -
只能表示正整數;
-
更節省空間(沒有負號位);
-
常用于索引、地址、長度等不能為負的場景。
-
它們與平臺架構有關:
-
32 位系統:
isize
==i32
,usize
==u32
-
64 位系統:
isize
==i64
,usize
==u64
-
-
常用于內存相關操作(如數組索引、指針運算);
-
usize
是索引數組/切片的標準類型。
🟡 二、復合類型與自定義類型(Struct、Enum、元組等,棧上或堆上混合)
這些類型通常在棧上保存其自身結構,但若包含如 String
、Vec
等堆分配成員,則這些成員的實際數據存儲在堆上,僅其指針或元數據位于棧上。
? 正確認解:
🟡 復合類型與自定義類型(Struct、Enum、元組等)可以存儲在棧上,也可以部分或全部在堆上,具體取決于其字段成員是否包含堆分配的類型(如
String
、Vec
、Box
等)。
🔍 舉例說明:
? 全部在棧上(不包含堆分配類型):
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 等并發結構 | 并發環境下的共享/協同 | ?(復合對象) |