gpt4 book ai didi

rust - 需要关于 Rust 的单元格和引用计数类型的整体解释

转载 作者:行者123 更新时间:2023-11-29 07:40:04 25 4
gpt4 key购买 nike

Rust 标准库中有几种包装器类型:

据我了解,这些包装器提供了比简单引用更多的可能性。虽然我了解一些基础知识,但我看不到全貌。

他们到底是做什么的?单元格和引用计数家族是否提供正交或相似的特征?

最佳答案

Rust 中有两个基本概念:

  • 所有权,
  • 可变性。

各种指针类型(BoxRcArc)与所有权有关:它们允许控制单个对象是否有一个或多个所有者。

另一方面,各种单元格(CellRefCellMutexRwLockAtomicXXX) 与可变性有关。


Rust 安全性的基础规则是Aliasing NAND Mutability。也就是说,只有在没有对其内部的突出引用时,才能安全地改变对象。

此规则通常在编译时由借用检查器强制执行:

  • 如果你有一个&T,你不能在范围内对同一个对象也有一个&mut T
  • 如果您有一个&mut T,则您不能在范围内也有任何对同一对象的引用。

但是,有时,这不够灵活。有时你确实需要(或想要)对同一个对象有多个引用并改变它的能力。输入单元格

CellRefCell 的想法是在存在别名的情况下允许可变性以受控方式:

  • Cell 防止形成对其内部的引用,避免悬空引用,
  • RefCellAliasing XOR Mutability 的实现从编译时转移到运行时。

此功能有时被描述为提供内部可变性,即从外部 (&T) 看起来不可变的对象实际上可以发生变异。

当这种可变性扩展到多个线程时,您将改为使用 MutexRwLockAtomicXXX;它们提供相同的功能:

  • AtomicXXX 只是Cell:没有引用内部,只是移入/移出,
  • RwLock就是RefCell:可以通过guards获取内部的引用,
  • MutexRwLock 的简化版本,不区分只读保护和写保护;因此在概念上类似于只有 borrow_mut 方法的 RefCell

如果您有 C++ 背景:

  • Boxunique_ptr,
  • Arcshared_ptr,
  • Rcshared_ptr 的非线程安全版本。

并且单元格提供与可变类似的功能,除了额外的保证以避免别名问题;将 Cell 视为 std::atomic 并将 RefCell 视为 std::shared_mutex 的非线程安全版本(如果锁被占用,它会抛出而不是阻塞)。

关于rust - 需要关于 Rust 的单元格和引用计数类型的整体解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45674479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com