Rust 中的克隆 Arc
這篇文章是關於原子引用計數(Arc)
,一個處理一個物件(型別 T
)並允許共享所有權的代理。我們還將學習使用 clone()
函式建立一個新的擁有的控制代碼,它可以移動到一個新執行緒。
此外,我們將藉助示例瞭解共享所有權。
Rust 中的共享所有權
共享所有權是指多個名稱對單個物件的所有權。例如,你為家人購買的狗。
你不能指定一個明確的所有者,因為所有家庭成員都共享該狗的所有權。我們必須認識到,如果其中一個家庭成員死了,狗不會和他們一起死。
另一方面,如果所有家庭成員都死了,狗就會死。基本原理是這樣的:每個人都擁有一些東西,最後一個站著清理它。
可能僅使用傳統的 Rust 技術不足以描述這種共享所有權形式。例如,你必須始終為狗指定一個主人,而其他人只能指代狗。
Rust 中的 Rc
和 Arc
允許共享所有權。
在 Rust 中克隆 Arc
的效果
Arc<T>
型別表示在跳躍中分配的共享介質中型別 T
值的所有權。當引用計數增加時,會形成一個新的 Arc
例項,連線到與原始 Arc
相同的堆分配。
在 Rust 中使用 Rc
對記憶體的影響
let nil = Rc::new(Dog { legs: 4 });
在記憶體中,狗生活在堆上,計數為 1
(計數器設定為 1
)。因此,計數器知道物件資料在當前情況下擁有的所有者數量。
而 1
是正確的,因為 nil
是目前擁有狗的人。
clone()
Rust 中的 Rc
let esh = nil.clone();
let kat = nil.clone();
由於這段程式碼,狗只在記憶體中存在一次。然而,引用計數增加到 3
,這是合乎邏輯的,因為狗有三個主人。
這三個所有者引用堆上的記憶體塊。這樣,Rust book 呼叫了所有的控制代碼:每個所有者都擁有底層物件。
我們需要知道 Arc<T>
上的 clone()
不會克隆 T
而是建立另一個擁有的控制代碼。它只是一個指標,其行為就像它持有底層物件一樣。
Rust 中 Arc<T>
和 Rc<T>
的區別
多個執行緒可以使用 Arc
以原子方式增加和減少計數器,而不會出現問題。因此,Arc
不限於執行緒邊界。
然而,Arc
並不意味著提供來自多個所有者的同時可變訪問。因此,Rc<T>
用於多重所有權,而 Arc<T>
用於超出執行緒邊界的多重所有權。
Rc<T>
允許我們擁有多個指向同一資料的指標,並且在所有指標被釋放後資料被釋放。