当前位置: 首页 > news >正文

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;
StringString::from()
Vec<T>vec![1,2]
struct✅/❌❌/✅自定义结构体
Box<T>Box::new()
Rc<T>❌(非线程)Rc::new()
Arc<T>Arc::new()
DashMapDashMap::new()
Tokio::RwLock✅(异步)异步共享锁

✅ 总结记忆法:

类型用途是否“对象”
标量类型控制流、计算、栈数据
结构体/枚举/元组组织数据结构,自定义模型
String, Vec动态数据,堆分配
DashMap 等并发结构并发环境下的共享/协同✅(复合对象)

http://www.lqws.cn/news/566929.html

相关文章:

  • 【软考--软件设计师】2025-05 我的选择题错题总结
  • ListExtension 扩展方法增加 转DataTable()方法
  • 商业行业项目创业计划书PPT模版
  • 什么是区块链的跨链操作?
  • 穿越时空的光
  • 详解快速排序
  • SRS流媒体服务器(8)源码分析之rtc/rtmp互相转码详解
  • 数据可视化 - 单子图
  • 第10章 数组和指针
  • 左神算法之螺旋打印
  • SQL Server从入门到项目实践(超值版)读书笔记 19
  • 从GPTs到Real智能体:目前常见的几种创建智能体方式
  • spring:BeanPostProcessor后置处理器介绍
  • 小米路由器 AX3000T自定义子网掩码
  • Mybatis多条件查询设置参数的三种方法
  • stm32hal模块驱动(1)hpdl1414驱动
  • Vue的watch函数实现
  • 华为云 Flexus+DeepSeek 征文|华为云 Flexus 云服务 Dify-LLM 平台深度部署指南:从基础搭建到高可用实践
  • 智能制造——解读西门子数字化工厂规划报告(三年实施计划)【附全文阅读】
  • 机器学习在智能供应链中的应用:需求预测与库存优化
  • 大事件项目记录12-文章管理接口开发-总
  • 设计模式之适配器模式
  • OpenCV读取照片和可视化详解和代码示例
  • MySQL 安装使用教程
  • Java垃圾收集机制Test
  • PL-SLAM: Real-Time Monocular Visual SLAM with Points and Lines
  • Ai工具分享(2):Vscode+Cline无限免费的使用教程
  • XWPFDocument导出word文件
  • Linux中《动/静态库原理》
  • Redis缓存击穿深度解析:从现象到实战的完整解决方案