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

WHAT - Rust 智能指针

文章目录

  • 常见的智能指针类型
    • 1. `Box<T>` — 堆上分配的数据
    • 2. `Rc<T>` — 引用计数的共享所有权(单线程)
    • 3. `Arc<T>` — 原子引用计数(多线程)
    • 4. `RefCell<T>` — 运行时可变借用(单线程)
    • 5. `Mutex<T>` 与 `RwLock<T>` — 多线程的可变共享
  • 综合对比表

在 Rust 中,智能指针(Smart Pointers) 是对普通指针的封装,除了指向某个值,它们还拥有额外的行为(比如自动释放资源、共享所有权、内变性等)。

智能指针在 Rust 中广泛用于内存管理和所有权系统。

常见的智能指针类型

1. Box<T> — 堆上分配的数据

  • 用途:将数据存储在堆上,适用于大小不确定的类型(如递归类型)。
  • 特点:唯一所有权,开销小,支持解引用。
let b = Box::new(5);
println!("{}", *b);  // 解引用输出 5

2. Rc<T> — 引用计数的共享所有权(单线程)

  • 用途:多个所有者共享同一份堆内数据(适用于不可变数据)。
  • 特点:只适用于单线程,不可变共享,内部使用引用计数。
use std::rc::Rc;let a = Rc::new(5);
let b = Rc::clone(&a);
println!("Count: {}", Rc::strong_count(&a)); // Count: 2

3. Arc<T> — 原子引用计数(多线程)

  • 用途:在多线程中安全共享所有权。
  • 特点:线程安全(用原子操作实现),开销比 Rc 大。
use std::sync::Arc;
use std::thread;let a = Arc::new(5);
let b = Arc::clone(&a);
thread::spawn(move || {println!("From thread: {}", b);
});

4. RefCell<T> — 运行时可变借用(单线程)

  • 用途:在不可变环境中实现内部可变性(Interior Mutability)。
  • 特点:运行时检查借用规则,适合单线程。
  • 常与 Rc 一起用来构建复杂结构(如图、树)。
use std::cell::RefCell;let x = RefCell::new(5);
*x.borrow_mut() = 10;
println!("{}", x.borrow());  // 输出 10

5. Mutex<T>RwLock<T> — 多线程的可变共享

  • 用途:实现线程间的可变访问控制。
  • Mutex<T>:一次只能一个线程访问。
  • RwLock<T>:可以多个读者或一个写者。
use std::sync::Mutex;let data = Mutex::new(5);
{let mut guard = data.lock().unwrap();*guard = 10;
}
println!("{:?}", data.lock().unwrap());  // 输出 10

综合对比表

类型所有权共享可变性是否线程安全应用场景
Box<T>堆分配、递归结构
Rc<T>单线程多所有者共享
Arc<T>多线程共享数据
RefCell<T>单线程内部可变性
Mutex<T>多线程可变性控制
http://www.xdnf.cn/news/315703.html

相关文章:

  • 【PostgreSQL】数据库主从库备份与高可用部署
  • 探索智能体开发新边界:Cangjie Magic开源平台体验与解析
  • maven基本介绍
  • Nginx+Lua+Redis实现灰度发布
  • spring4.x详解介绍
  • 一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
  • Go语言八股之channel详解
  • LeetCode 热题 100 64. 最小路径和
  • 明远智睿SD2351核心板:工业AIoT时代的创新引擎
  • 大数据、物联网(IoT)、平台架构与设计重构大模型应用
  • 轻松管理房间预约——启辰智慧预约小程序端使用教程
  • 软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)
  • Linux中的`export` 设置的环境变量是临时的吗?如何永久生效?
  • 使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结
  • AI驱动的Kubernetes管理:kubectl-ai 如何简化你的云原生运维
  • 验证es启动成功
  • Nacos源码—5.Nacos配置中心实现分析一
  • Linux内核初始化机制全解析:从pure_initcall到late_initcall
  • ETL介绍
  • AI与Web3.0:去中心化智能合约的未来
  • 成都养老机器人“上岗”,机器人养老未来已至还是前路漫漫?
  • 为了结合后端而学习前端的学习日志(1)——纯CSS静态卡片案例
  • 移动二维矩阵
  • 场景可视化与数据编辑器:构建数据应用情境​
  • 结构可视化:利用数据编辑器剖析数据内在架构​
  • 什么是跨域,如何解决跨域问题
  • Mac 使用 Charles代理生成https服务
  • nginx性能优化与深度监控
  • 一篇文章解析 H.264/AVC 视频编解码标准框架
  • 如何使用极狐GitLab 软件包仓库功能托管 npm?