Rust 智能指针 std::rc::Rc 和 std::sync::Arc 分别类似于 C++ 智能指针 std::shared_ptr 和 std::atomic_shared_ptr 吗?

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

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

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

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

C++ 没有等同于 Rust 的 Rc<T>

std::rc::Rcstd::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 没有标准化以支持此专业化。

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

另请参阅:

For example in C++ std::shared_ptr the reference count in the control block is atomic despite the pointer itself is not. Is it the same in Rust's 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/