Rust的智能指针 std::rc::Rc
和 std::sync::Arc
与C++的智能指针 std::shared_ptr
和 std::atomic_shared_ptr
之间有类比关系吗?对我来说,它们看起来很相似,但可能存在一些实现细节差异。例如,在C ++中,std::shared_ptr
中,控制块中的引用计数是原子的,尽管指针本身不是。在Rust的 std::rc::Rc
中是否也是如此?
Rust的智能指针 std::rc::Rc
和 std::sync::Arc
与C++的智能指针 std::shared_ptr
和 std::atomic_shared_ptr
之间有类比关系吗?对我来说,它们看起来很相似,但可能存在一些实现细节差异。例如,在C ++中,std::shared_ptr
中,控制块中的引用计数是原子的,尽管指针本身不是。在Rust的 std::rc::Rc
中是否也是如此?
Arc<T>
与C++的shared_ptr<T>
在很大程度上是等价的两者都是“智能指针”,通过引用计数提供值的共享所有权。它们都使用原子操作进行内部操作,以便可以安全地在线程之间跟踪所有权。
一个显着的区别是C++的std::shared_ptr
实现提供了一个“别名构造函数”,您可以创建一个std::shared_ptr<U>
用于std::shared_ptr<T>
的嵌套字段,使得std::shared_ptr<U>
可以正确跟踪根T
对象。
Rc<T>
等价物std::rc::Rc
和std::sync::Arc
之间唯一的区别是内部引用跟踪不是原子的。这意味着它不能在线程之间使用,但它避免了原子操作的潜在成本。
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
没有标准化,而是采用了这种特化。
可能存在等价物的库,但我只包括了各自的标准库。
另请参见:
atomic<shared_ptr<T>>
的“等价”时,值得注意的是,atomic<shared_ptr<T>>
在每个平台上都存在,但不保证是无锁的,而AtomicPtr<T>
始终是无锁的,但不保证在每个平台上都存在。有一个crate
(IRC中的atomic
)提供了一个具有类似C++语义的Atomic<T>
类型构造器。 - trentshared_ptr<T>
在线程之间是安全的,但这并不意味着T
在线程之间是安全的,而 Rust 的类型系统可以确保这一点",或者 C++ 有 这些 函数,而 Rust 有 这些 函数,或者像你所说的标准库选择提供跨平台支持。我尽力给出了差异的总体概述,因为那似乎是问题的重点。 - kmdreko
atomic_shared_ptr
从未成为std
的一部分,它 存在于experimental
直到它被 标准化为std::atomic<std::shared_ptr<T>>
的特化实现。这有助于回答问题吗?或者您是否希望在考虑到这个事实的情况下重新表述问题? - trent