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.pswp.cn/news/912471.shtml
繁体地址,请注明出处:http://hk.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;拥有独立的地址空…