Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Rc

Rc — разделяемый указатель с подсчётом ссылок. Используйте его, когда нужно обращаться к одним и тем же данным из нескольких мест:

// 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 указывает на одну и ту же разделяемую структуру данных, которая содержит сильные и слабые указатели и значение:

StackHeapcount:2value:10a:b:
  • См. Arc и Mutex, если вы работаете в многопоточном контексте.
  • Разделяемый указатель можно понизить до Weak указателя, чтобы создавать циклы, которые в итоге будут освобождены.
This slide should take about 5 minutes.
  • Счётчик Rc гарантирует, что содержащееся значение остаётся корректным, пока есть ссылки на него.
  • Rc в Rust похож на std::shared_ptr в C++.
  • Rc::clone дёшев: он создаёт указатель на ту же выделенную область памяти и увеличивает счётчик ссылок. Это не глубокое клонирование, и при поиске проблем с производительностью его обычно можно не учитывать.
  • make_mut при необходимости клонирует внутреннее значение («clone-on-write») и возвращает изменяемую ссылку.
  • Используйте Rc::strong_count, чтобы проверить счётчик ссылок.
  • Rc::downgrade даёт слабо подсчитываемый объект, чтобы создавать циклы, которые будут корректно освобождены (вероятно, в сочетании с RefCell).