[英]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
中是否相同?
Arc<T>
在很大程度上等同於 C++ 的shared_ptr<T>
兩者都是“智能指針”,通過引用計數提供值的共享所有權。 它們都將原子用於內部操作,以便可以在線程之間安全地跟蹤所有權。
一個顯着的區別是 C++ std::shared_ptr
實現提供了一個別名構造函數,您可以在其中為std::shared_ptr<T>
的嵌套字段創建std::shared_ptr<U>
,這樣std::shared_ptr<U>
正確跟蹤根T
object。
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
沒有標准化以支持這種專業化。
可能存在等效庫,但我只包含了相應標准庫中的內容。
也可以看看:
例如在 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 /
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.