Rust中Box、Rc、Arc、Cell、RefCell、Cow简介
一、Box 是一种独享所有权智能指针,类似C++的unique_ptr
资源分配在堆上,依靠Deref和Drop来管理堆上的资源,零运行时开销,是最常用的套娃。
Box::new(v)
: 创建,移动语义,独占所有权 - move,允许使用*转移本体所有权
不可变借用:Box::borrow()、Box::as_ref()、Box::deref()
可变借用:Box::borrow_mut()、Box::as_mut()、Box::deref_mut()
二、Rc是一种共享所有权智能指针,类似C++的shared_ptr
资源分配在堆上,依靠Deref和Drop来管理堆上的资源,使用引用计数算法。
Rc::new(v)
: 创建,移动语义,共享所有权 - clone,禁止使用*转移本体所有权
不可变借用:Rc::borrow()、Rc::as_ref()、Rc::deref()
可变借用:Rc::borrow_mut()、Rc::as_mut()、Rc::deref_mut()
三、Arc是一种线程安全的共享所有权智能指针,类似C++的shared_ptr + mutex
资源分配在堆上,依靠Deref和Drop来管理堆上的资源,使用引用计数算法。
Arc::new(v)
: 创建,移动语义,共享所有权 - clone,禁止使用*转移本体所有权
不可变借用:Arc::borrow()、Arc::as_ref()、Arc::deref()
可变借用:Arc::borrow_mut()、Arc::as_mut()、Arc::deref_mut()
四、Cell是一种提供内部可变性的容器,类似智能手机电池,看似不可换,打开盖子后是可以换的
适合实现了Copy的类型,或者体积小的struct,因为get方法是直接按位复制的。
无运行时开销,运行时安全。
Cell::new(v)
: 创建,移动语义
获取本体v:Cell::get()
获取本体借用&v:Cell::get_mut()
修改本体v:Cell::set(vv)
四、RefCell是一种提供内部可变性的容器,类似智能手机电池,看似不可换,打开盖子后是可以换的
适合未实现了Copy的类型,或者体积大的struct,Cell不好使的都是用这个。
运行时有开销,会执行借用检查,运行时不安全。
RefCell::new(v)
: 创建,移动语义
不可变借用:RefCell::borrow()、类似Cell::get
可变借用:RefCell::borrow_mut()、类似Cell::set
五、Cow是一种写时复制的枚举体的智能指针,类似扫地僧,实际是武林高手
目的是减少复制操作,提高性能,多用于读多写少的场景
Cow::Borrowed(v) | Cow::Owned(v)
: 创建,移动语义
不可变借用:Cow::deref(),Owned会调用borrow返回,Borrowed直接返回
可变借用:Cow::to_mut(),Borrowed会调用clone替换自己为Owned,然后Owned会匹配ref mut释放借用。
获得本体:Cow::into_owned(),Borrowed会调用clone后返回,Owned会把自己返回。
参考:
Rust - Box|Rc|Arc|Cell|RefCell|Cow
rust之Cell、RefCell
Cell, RefCell
Rust中Box、Rc、Arc、Cell、RefCell、Cow简介相关推荐
- Rust 中的指针:Box、Rc、Cell、RefCell
Rust 中的指针:Box.Rc.Cell.RefCell 作者:许野平 2022-02-21 Rust 自身具有 &.* 操作符,可以实现变量引用和解引用.为什么又搞出这几个类型的指针呢?原 ...
- Rust中的引用计数Arc与Rc
Rc 单线程引用计数.不是线程安全的,如果需要线程间引用计数可用Arc.注意他们之间的实现区别.关键源码实现如下,重点可关注Clone和Drop的实现细节. //! Single-threaded r ...
- rust全息要啥才能做_在 Rust 中不能做什么
编者注:上周 Armin 在自己的博客上首次发布了这个版本.如果你想再次阅读这篇文章,或者想看看 Armin 还在做什么,一定要去看看. 去年一直很有趣,因为我们用 Rust 建造了很多好东西,并且这 ...
- rust的矿坑_转: Rust中的Pin详解 【Rust语言中文社区】
Rust中的Pin详解 原创 automanyang Rust语言中文社区 昨天 https://mp.weixin.qq.com/s/PjctbPbyR5OeaqTHZdB5uQ 相关概念 Pin ...
- i3够晚rust吗_【译】理解Rust中的Futures (一)
原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...
- c++ enum 给定类型_在 Rust 中创建 C/C++ API
Rust 是一种神奇的语言,有着更好的生态系统.许多 Rust 的设计决策都非常适合向现有的C/C++系统添加新功能,或者逐步替换这些系统的部分! 当我尝试为 Rust 创建 C++ API 时,我发 ...
- Rust 中的继承与代码复用
Rust 中的继承与代码复用 在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结 ...
- Draconian,自由或保姆状态:Java,C#,C,C ++,Go和Rust中的并发意识形态
为什么我们需要并发 (Why we need Concurrency) Once, there was a good old time when clock speed doubled every 1 ...
- Rust中Turbofish之函数后面双冒号(::)用法
RUST中的语法,Turbofish通常用于在表达式中为泛型类型.函数或方法指定参数. 1. Turbofish语法 大部分时候当涉及到泛型时,编译器可以自动推断出泛型参数: // v must be ...
最新文章
- Oracle数据库之数据处理
- 瑞幸咖啡的每一个环节,都蕴含着增长知识点
- vim中如何设置多行注释和删除注释
- [转] 撞车之后,不要傻里傻气的!
- malware analysis、Sandbox Principles、Design Implementation
- yum安装:zabbix-web-4.2.8-1.el7.noarch: [Errno 256] No more mirrors to try
- Qt 5.9 mysql 驱动加载失败解决办法
- 《微积分》的本质笔记
- cadence中测输出功率方法
- 面经:计算机视觉工程师(字节跳动-飞书部门)
- itemarray的意思
- 2022 199管综真题及答案解析
- 0.linux中英文环境的切换
- win10系统多台电脑无界共享键鼠软件MouseWithoutBorders设置开机启动方法步骤
- 物联网RFID技术在智能交通系统的应用
- C++数据共享与保护static活期存款篇
- opencv处理视频文件
- php签到日历例子,PHP用日历记录签到功能
- DataManage
- u盘无法拷贝文件到计算机上怎么办,Win7系统电脑文件无法复制到U盘中的解决方法...