Что такое ржавчина вместо сборщика мусора?



довольно простой вопрос, но я новичок в Rust/C / C++ и т. д. Я понимаю, что у Rust нет сборщика мусора, и мне интересно, как освобождается память, когда привязка выходит за рамки.



Итак, в этом примере я понимаю, что Rust восстанавливает память, выделенную для "a", когда она выходит за рамки.



{
let a = 4
}


проблема, с которой я сталкиваюсь с этим, во-первых, как это происходит, а во-вторых, разве это не своего рода сбор мусора? Чем он отличается от "типичного" сбор мусора?



извинения, я знаю, что это несколько элементарно, но я исхожу из динамических языков.

567   3  

3 ответов:

сбор мусора обычно используется периодически или по требованию, например, если куча близка к полной или выше некоторого порога. Затем он ищет неиспользуемые переменные и освобождает их память, в зависимости от алгоритм.

Rust будет знать, когда переменная выходит из области видимости или ее срок службы заканчивается во время компиляции и, таким образом, вставить соответствующие инструкции LLVM/assembly, чтобы освободить память.

Руст также позволяет какой-то сбор мусора, как атомарный подсчет ссылок хотя.

языки с сборщиком мусора периодически сканируют память (так или иначе), чтобы найти неиспользуемые объекты, освободить связанные с ними ресурсы и, наконец, освободить память, используемую этими объектами объекты.

Rust не имеет GC, как он справляется?

ржавчина имеет право собственности. Используясистема аффинного типа, он отслеживает, какая переменная все еще удерживается на объекте и, когда такая переменная выходит из области видимости, вызывает ее деструктор. Вы можете увидеть аффинную систему типов в действии довольно легко:

fn main() {
    let s: String = "Hello, World!".into();
    let t = s;
    println!("{}", s);
}

выходы:

<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4         println!("{}", s);

<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3         let t = s;
                     ^

, которая прекрасно иллюстрирует, что в любой момент времени, на уровне языка, собственность отслеживается.

эта собственность работает рекурсивно: если у вас есть Vec<String> (т. е. динамический массив строк), то каждая String принадлежит Vec который сам принадлежит переменной или другому объекту и т. д... таким образом, когда переменная выходит из области видимости, она рекурсивно освобождает все ресурсы, которые она удерживала, даже косвенно. В случае с Vec<String> это значит:

  1. освобождение буфера памяти, связанного с каждым String
  2. выпускать буфер памяти, связанный с

Примечание: это немного оптимистично, используя подсчет ссылок (Rc или Arc) можно формировать циклы ссылок и таким образом вызывать утечки памяти, в этом случае ресурсы, привязанные к циклу, могут никогда не высвобождаться.

с языком, где вы должны вручную управлять памятью, различие между стеком и кучей становится критическим. Каждый раз при вызове функции в стеке выделяется достаточно места для всех переменных, содержащихся в области действия этой функции. Когда функция возвращается, кадр стека, связанный с этой функцией, "выскакивает" из стека, и память освобождается для будущего использования.

с практической точки зрения, эта непреднамеренная очистка памяти используется в качестве средства автоматического хранения памяти, которые будут очищены в конце области действия функции.

более подробная информация доступна здесь: https://doc.rust-lang.org/book/the-stack-and-the-heap.html

Comments

    Ничего не найдено.