Ответ 1
Мне кажется, что
Rc<>
должен состоять только из указателя, который имеет фиксированный размер, поэтому сам тип должен бытьSized
и, следовательно,Copy
, верно?
Это не совсем так. Rc
является аббревиатурой правочника С ounted. Это означает, что тип отслеживает, сколько ссылок указывают на принадлежащие данные. Таким образом, мы можем иметь несколько владельцев одновременно и безопасно освободить данные, как только счетчик ссылок достигнет 0.
Но как сохранить счетчик ссылок действительным и актуальным? Точно, мы должны что-то делать, когда создается новая ссылка/владелец и всякий раз, когда ссылка/владелец удаляется. В частности, мы должны увеличить счетчик в первом случае и уменьшить его во втором.
Счетчик уменьшается путем реализации Drop
, Rust-эквивалента деструктора. Эта функция drop()
выполняется всякий раз, когда переменная выходит из области видимости - идеально подходит для нашей цели.
Но когда мы делаем приращение? Вы догадались: в clone()
. Признак Copy
по определению говорит, что тип можно дублировать, просто копируя биты:
Типы, которые могут быть скопированы простым копированием битов (например,
memcpy
).
В нашем случае это не так, потому что: да, мы "просто копируем биты", но мы также делаем дополнительную работу! Нам нужно увеличить наш счетчик ссылок!