一、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简介相关推荐

  1. Rust 中的指针:Box、Rc、Cell、RefCell

    Rust 中的指针:Box.Rc.Cell.RefCell 作者:许野平 2022-02-21 Rust 自身具有 &.* 操作符,可以实现变量引用和解引用.为什么又搞出这几个类型的指针呢?原 ...

  2. Rust中的引用计数Arc与Rc

    Rc 单线程引用计数.不是线程安全的,如果需要线程间引用计数可用Arc.注意他们之间的实现区别.关键源码实现如下,重点可关注Clone和Drop的实现细节. //! Single-threaded r ...

  3. rust全息要啥才能做_在 Rust 中不能做什么

    编者注:上周 Armin 在自己的博客上首次发布了这个版本.如果你想再次阅读这篇文章,或者想看看 Armin 还在做什么,一定要去看看. 去年一直很有趣,因为我们用 Rust 建造了很多好东西,并且这 ...

  4. rust的矿坑_转: Rust中的Pin详解 【Rust语言中文社区】

    Rust中的Pin详解 原创 automanyang Rust语言中文社区 昨天 https://mp.weixin.qq.com/s/PjctbPbyR5OeaqTHZdB5uQ 相关概念 Pin ...

  5. i3够晚rust吗_【译】理解Rust中的Futures (一)

    原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...

  6. c++ enum 给定类型_在 Rust 中创建 C/C++ API

    Rust 是一种神奇的语言,有着更好的生态系统.许多 Rust 的设计决策都非常适合向现有的C/C++系统添加新功能,或者逐步替换这些系统的部分! 当我尝试为 Rust 创建 C++ API 时,我发 ...

  7. Rust 中的继承与代码复用

    Rust 中的继承与代码复用 在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结 ...

  8. Draconian,自由或保姆状态:Java,C#,C,C ++,Go和Rust中的并发意识形态

    为什么我们需要并发 (Why we need Concurrency) Once, there was a good old time when clock speed doubled every 1 ...

  9. Rust中Turbofish之函数后面双冒号(::)用法

    RUST中的语法,Turbofish通常用于在表达式中为泛型类型.函数或方法指定参数. 1. Turbofish语法 大部分时候当涉及到泛型时,编译器可以自动推断出泛型参数: // v must be ...

最新文章

  1. Oracle数据库之数据处理
  2. 瑞幸咖啡的每一个环节,都蕴含着增长知识点
  3. vim中如何设置多行注释和删除注释
  4. [转] 撞车之后,不要傻里傻气的!
  5. malware analysis、Sandbox Principles、Design Implementation
  6. yum安装:zabbix-web-4.2.8-1.el7.noarch: [Errno 256] No more mirrors to try
  7. Qt 5.9 mysql 驱动加载失败解决办法
  8. 《微积分》的本质笔记
  9. cadence中测输出功率方法
  10. 面经:计算机视觉工程师(字节跳动-飞书部门)
  11. itemarray的意思
  12. 2022 199管综真题及答案解析
  13. 0.linux中英文环境的切换
  14. win10系统多台电脑无界共享键鼠软件MouseWithoutBorders设置开机启动方法步骤
  15. 物联网RFID技术在智能交通系统的应用
  16. C++数据共享与保护static活期存款篇
  17. opencv处理视频文件
  18. php签到日历例子,PHP用日历记录签到功能
  19. DataManage
  20. u盘无法拷贝文件到计算机上怎么办,Win7系统电脑文件无法复制到U盘中的解决方法...

热门文章

  1. Signal和Slot是同步的还是异步的
  2. FTL(FreeMarker)基础
  3. anaconda3 安装tensorflow 报Cannot remove entries fro
  4. MySQL之索引优化
  5. Java线程池架构(一)原理和源码解析
  6. 如何修复在Microsoft Azure中“虚拟机防火墙打开,关闭RDP的连接端口”问题
  7. LeetCode OJ - Sort List
  8. Java程序员最常用的20%技术总结
  9. shell监控web服务的多种方案
  10. 美国国土安全部发布物联网安全最佳实践