Rust标量、复合类型与自定义类型、第三方并发结构
以下是 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 等并发结构 | 并发环境下的共享/协同 | ✅(复合对象) |