Rust标量、复合类型与自定义类型、第三方并发结构

发布于:2025-07-01 ⋅ 阅读:(23) ⋅ 点赞:(0)

以下是 Rust 中标量类型、对象类型(含结构体、复合类型、堆分配类型)以及常用第三方并发数据结构的完整分类、示例和区别对比,帮助你系统掌握它们的本质异同:


🟢 一、标量类型(Scalar Types,存储于栈上)

标量是最基本的值类型,固定大小,存储在栈上,实现 Copy,性能极高。

类别 示例类型 示例代码 特性说明
整数 i8i128, u8u128, 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 位)

✅ 特点:


🔶 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 开头)

    类型 位宽 数值范围
    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 == 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 等并发结构 并发环境下的共享/协同 ✅(复合对象)


网站公告

今日签到

点亮在社区的每一天
去签到