簡體   English   中英

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實現提供了一個別名構造函數,您可以在其中為std::shared_ptr<T>的嵌套字段創建std::shared_ptr<U> ,這樣std::shared_ptr<U>正確跟蹤根T object。

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沒有標准化以支持這種專業化。

可能存在等效,但我只包含了相應標准庫中的內容。

也可以看看:

例如在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM