Rust 中的克隆 Arc

Nilesh Katuwal 2023年1月30日
  1. Rust 中的共享所有權
  2. 在 Rust 中克隆 Arc 的效果
  3. 在 Rust 中使用 Rc 對記憶體的影響
  4. clone() Rust 中的 Rc
  5. Rust 中 Arc<T>Rc<T> 的區別
Rust 中的克隆 Arc

這篇文章是關於原子引用計數(Arc),一個處理一個物件(型別 T)並允許共享所有權的代理。我們還將學習使用 clone() 函式建立一個新的擁有的控制代碼,它可以移動到一個新執行緒。

此外,我們將藉助示例瞭解共享所有權。

Rust 中的共享所有權

共享所有權是指多個名稱對單個物件的所有權。例如,你為家人購買的狗。

你不能指定一個明確的所有者,因為所有家庭成員都共享該狗的所有權。我們必須認識到,如果其中一個家庭成員死了,狗不會和他們一起死。

另一方面,如果所有家庭成員都死了,狗就會死。基本原理是這樣的:每個人都擁有一些東西,最後一個站著清理它。

可能僅使用傳統的 Rust 技術不足以描述這種共享所有權形式。例如,你必須始終為狗指定一個主人,而其他人只能指代狗。

Rust 中的 RcArc 允許共享所有權。

在 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> 允許我們擁有多個指向同一資料的指標,並且在所有指標被釋放後資料被釋放。