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::Rc
和 std::sync::Arc
与 C++ 智能指针 std::shared_ptr
和 std::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::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
没有标准化以支持此专业化。
可能存在 库 等价物,但我只包含了相应标准库中的内容。
另请参阅:
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/
Rust 智能指针 std::rc::Rc
和 std::sync::Arc
与 C++ 智能指针 std::shared_ptr
和 std::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::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
没有标准化以支持此专业化。
可能存在 库 等价物,但我只包含了相应标准库中的内容。
另请参阅:
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/