3.2 `Rc`

02-Rc — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/smart-pointers/rc.html

3.2 Rc

Rc 是引用计数的共享指针。当你需要从多处引用同一份数据时使用它:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::rc::Rc;

fn main() {
    let a = Rc::new(10);
    let b = Rc::clone(&a);

    dbg!(a);
    dbg!(b);
}

每个 Rc 都指向同一个共享数据结构,其中包含强/弱指针计数以及值本身:

 Stack                     Heap
.- - - - - - - -.     .- - - - - - - - - - - - - - - - -.
:               :     :                                 :
:     +-----+   :     :   +-----------+-------------+   :
:  a: | o---|---:--+--:-->|  count: 2 |  value: 10  |   :
:     +-----+   :  |  :   +-----------+-------------+   :
:  b: | o---|---:--+  :                                 :
:     +-----+   :     `- - - - - - - - - - - - - - - - -'
:               :     
`- - - - - - - -'
  • 若在多线程环境中,请参见 Arc 与 Mutex。
  • 可以把共享指针_降级_为 Weak 指针,以创建会被正确丢弃的循环引用。
  • Rc 的计数确保只要还有引用,其包含的值就一直有效。
  • Rust 中的 Rc 类似 C++ 的 std::shared_ptr。
  • Rc::clone 很便宜:它创建指向同一分配的指针并增加引用计数。不会做深克隆,在排查性能问题时通常可以忽略。
  • make_mut 在必要时会实际克隆内部值(「写时克隆」)并返回可变引用。
  • 用 Rc::strong_count 可查看引用计数。
  • Rc::downgrade 给你一个_弱引用计数_对象,用于创建会被正确丢弃的循环(通常与 RefCell 配合)。
最后修改 August 11, 2026: 更新 (70a5af133)