为什么Rust重复使用具有相同值的内存

Dar*_*ell 4 memory rust borrow

示例代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果第三次分配包含&3代码输出:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a8
Run Code Online (Sandbox Code Playgroud)

如果第三个分配包含&2(与第二个分配相同的值),则代码输出:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a4
Run Code Online (Sandbox Code Playgroud)

如果第三个分配包含&5(与第一个分配相同的值),则代码输出:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a0
Run Code Online (Sandbox Code Playgroud)

如果赋值相同,为什么生锈不释放内存而是重新使用它,否则分配新的内存块?

cor*_*ump 5

相同文字数的两次出现是无法区分的。您不能期望两个文字的地址相同,也不能期望它们不同。

这允许编译器(但实际上可以自由地进行其他操作)5在可执行代码中发出一个数据,并全部&5引用该数据。常量可能(见注释)也有一个静态的一生,在这种情况下,他们没有被分配/程序执行过程中释放,他们总是被分配。

  • *常量*可以*提升为静态值,但通常它们也可能成为临时值或被完全编译掉。5在这里得到静态提升处理,因为代码显式地获取其地址;如果不是这样,则编译器可以自由地在寄存器中创建它,也可以对其进行优化以完全不存在,二进制文件中根本没有5。 (2认同)
  • @trentcl:实际上,得知它不能保证我不会感到惊讶。具体来说,如果编译器能够“删除”地址,例如使用“ let x =&5; println!(“ {}”,1 + * x);`这样我就不会期望在二进制文件的数据部分中找到文字“ 5”,我希望看到直接嵌入到程序集中的“ 6”。 。 (2认同)