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