【问题标题】:Are Rust smart pointers std::rc::Rc and std::sync::Arc analogous to the C++ smart pointers std::shared_ptr and std::atomic_shared_ptr respectively?Rust 智能指针 std::rc::Rc 和 std::sync::Arc 是否分别类似于 C++ 智能指针 std::shared_ptr 和 std::atomic_shared_ptr?
【发布时间】:2021-04-12 18:18:01
【问题描述】:

Rust 智能指针 std::rc::Rc 和 std::sync::Arc 与 C++ 智能指针 std::shared_ptr 和 std::atomic_shared_ptr 之间是否有类比?对我来说,它们看起来一样,但可能存在一些实现上的细微差别。例如在 C++std::shared_ptr 中,控制块中的引用计数是原子的,尽管指针本身不是。 Rust 的std::rc::Rc 是不是也一样?

【问题讨论】:

标签: c++ rust smart-pointers


【解决方案1】:

Rust 的 Arc<T> 在很大程度上等同于 C++ 的 shared_ptr<T>

两者都是“智能指针”,通过引用计数提供值的共享所有权。它们都使用原子进行内部操作,以便可以安全地在线程之间跟踪所有权。

一个显着的区别是 C++ std::shared_ptr 实现提供了一个别名构造函数,您可以在其中为 std::shared_ptr<T> 的嵌套字段创建 std::shared_ptr<U>,以便 std::shared_ptr<U> 跟踪根T 对象正确。

C++ 没有 Rust 的 Rc<T> 等价物

std::rc::Rc 和std::sync::Arc 之间的唯一区别是内部参考跟踪不是原子的。这意味着它不能在线程之间使用,但具有避免原子操作的潜在成本的好处。

Rust 没有 C++ 的 atomic<shared_ptr<T>> 等价物

C++ 的std::atomic 是通用的,所以它的原子指针类型是std::atomic<T*>,而Rust 的只有专用类型std::sync::atomic::AtomicPtr<T>。 C++ 对std::atomic<std::shared_ptr<T>> 进行了专门化,因此多个线程可以原子地访问和修改shared_ptr 本身,而不仅仅是共享值。 OP 提到的std::atomic_shared_ptr 没有标准化以支持这种专业化。

可能存在 libraries 的等价物,但我只包含了各自标准库中的内容。

另见:

【讨论】:

  • 在考虑 Rust 是否具有 atomic<shared_ptr<T>> 的“等价物”时,可能值得注意的是 atomic<shared_ptr<T>> 存在于每个平台上,但不能保证是无锁的,而 AtomicPtr<T> is always lock-free, but not guaranteed to exist on every platform .有一个 crate (atomicIIRC),它提供了一个 Atomic<T> 类型构造函数,具有类似 C++ 的语义。
  • @trentcl 我可能整天都在这里讲述诸如“shared_ptr<T> 在线程之间是安全的,但这并不意味着T 在线程之间是安全的,而 Rust 的类型系统可以确保这一点”,或者C++ 有 这些 函数,但 Rust 有 这些,或者像你提到的标准库如何选择提供跨平台支持。我尽我所能对差异进行了总体概述,因为这似乎是问题的重点。
  • 明白。我的评论并不是对您的答案(或 C++)的批评,而是比任何事情都更“有趣的事实”。
【解决方案2】:

例如在 C++ std::shared_ptr 中,控制块中的引用计数是原子的,尽管指针本身不是原子的。 Rust 的 std::rc::Rc 是不是也一样?

没有。 Arc 类似于 shared_ptr:引用计数是原子的(因此是线程安全的),数据不是(这就是为什么您通常会看到 Arc<Mutex<T>> 或 Arc<RwLock<T>> 以允许突变内部类型,否则Arc 将只提供只读访问)。

Rc 是完全不同步的,实际上不能在线程之间静态移动(它是!Send)。 C++标准库中没有这种类型[0]。

[0] 虽然 libstdc++ 将使用非线程安全的shared_ptr,但如果它认为不涉及多线程,那更多的是一种优化/破解:https://snf.github.io/2019/02/13/shared-ptr-optimization/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2017-12-03
    相关资源
    最近更新 更多