Почему Rust повторно использует память с тем же значением - PullRequest
4 голосов
/ 31 октября 2019

Пример кода:

fn main() {
    let mut y = &5; // 1

    println!("{:p}", y);

    {
        let x = &2; // 2
        println!("{:p}", x);
        y = x;
    }

    y = &3; // 3
    println!("{:p}", y);
}

Если третье назначение содержит &3, то вывод кода:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a8

Если третье назначение содержит &2 (то же значение со вторым назначением), тоВывод кода:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a4

Если третье назначение содержит &5 (то же значение, что и в первом назначении), то вывод кода:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a0

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

Ответы [ 2 ]

5 голосов
/ 31 октября 2019

Два вхождения одного и того же литерального номера неразличимы. Вы не можете ожидать, что адреса двух литералов будут одинаковыми, и вы не можете ожидать, что они будут разными.

Это позволяет компилятору (но на самом деле он может делать иное) испускать одну 5 информацию в исполняемом коде, и все &5 ссылаются на нее. Константы могут (см. Комментарий) также имеют статическое время жизни, и в этом случае они не выделяются / не освобождаются во время выполнения программы, они всегда выделяются.

4 голосов
/ 31 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...