当前位置:首页 > 科技  > 软件

深入研究Rust的内部可变性- Cell是如何工作的?

来源: 责编: 时间:2024-07-05 11:45:28 213观看
导读在Rust中,我们从引用借用的规则中知道有不可变(共享)引用和可变(独占)引用。如果我们有一个共享引用,我们可以想要多少就有多少。这是因为这些引用不允许我们改变它们指向的值,所以同时有多个引用是可以的。可变引用则不

在Rust中,我们从引用借用的规则中知道有不可变(共享)引用和可变(独占)引用。I2C28资讯网——每日最新资讯28at.com

如果我们有一个共享引用,我们可以想要多少就有多少。这是因为这些引用不允许我们改变它们指向的值,所以同时有多个引用是可以的。I2C28资讯网——每日最新资讯28at.com

可变引用则不然,顾名思义,可变引用允许我们改变它们所指向的值。所以在这种情况下,对值有多个引用是不行的。例如,考虑两个线程,其中每个线程都持有一个独占引用并同时更改其值。线程运行后的值应该是什么?确切地说,这是一个未定义的行为!I2C28资讯网——每日最新资讯28at.com

那么为什么Rust允许我们拥有可共享的可变容器呢?这不是打破了Rust的借用规则吗?这是因为这些容器有限制,允许以安全的方式使用它们,同时仍然提供允许可变的api。这就是为什么这些类型提供“内部可变性”,当使用它们时,它们作为容器施加限制,在这些限制下,它们所持有的类型可以被安全地修改!I2C28资讯网——每日最新资讯28at.com

Cell 如何提供内部可变性?

基本上,Cell通过确保没有指向其保存的数据的指针并且在单线程环境中执行来实现这一点。I2C28资讯网——每日最新资讯28at.com

有了这些限制,更改Cell中的数据是完全可以的。想想看,如果我们知道Cell中没有指向数据的指针,并且它不是跨线程共享的,则可以保证我们对它具有独占访问权。I2C28资讯网——每日最新资讯28at.com

现在的问题是,Cell是如何施加这些约束的?Cell通过从不返回对其内部数据的引用来实现这一点,它总是返回数据的副本。因此,这已经告诉Cell适用于内存开销小的类型,例如整数。I2C28资讯网——每日最新资讯28at.com

此外,Cell没有实现Sync,因此它不能在线程边界之间共享。I2C28资讯网——每日最新资讯28at.com

Cell的构建块是UnsafeCell,这是Rust内部可变性的构建块之一。UnsafeCell允许我们在任何时候获得一个原始的独占指针,指向它所保存的数据。这当然是一个不安全的操作,所以我们必须在unsafe{}块中进行操作。I2C28资讯网——每日最新资讯28at.com

Cell的一种可能的简化实现是:I2C28资讯网——每日最新资讯28at.com

use std::cell::UnsafeCell;struct Cell<T> {    value: UnsafeCell<T>}// 禁止跨线程使用Cellimpl<T> !Sync for Cell<T> {}impl<T> Cell<T> {    pub fn new(value: T) -> Self {        Cell { value: UnsafeCell::new(value) }    }    pub fn set(self, value: T) {        // 用一个新值覆盖单元格所指向的值        unsafe { *self.value.get() = value }    }    pub fn get(&self) -> T where T: Copy {        // 返回Cell所指向的数据的副本        unsafe { *self.value.get() }    }}

这里我们使用UnsafeCell来存储Cell的数据,不允许在线程之间共享此类型,最后,我们从不引用Cell中的数据。注意,get方法只适用于实现Copy的类型,并且返回内部类型的副本。I2C28资讯网——每日最新资讯28at.com

在本文中,我们探讨了Rust的Cell类型,我们了解到Cell通过对其持有的数据施加约束来允许内部可变性。I2C28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-99019-0.html深入研究Rust的内部可变性- Cell是如何工作的?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 深入理解 Git:checkout 的本质与原理深度解析

下一篇: Python 数值运算神器:15 个高效数学模块与函数

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top