4

示例代码:

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

为什么rust不释放内存而是在赋值相同的情况下重用它,否则分配一个新的内存块?

4

2 回答 2

5

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

这允许编译器(但实际上它可以自由地做其他事情)5在可执行代码中发出一个数据,并让所有人都&5引用它。常量可能(见注释)也有一个静态生命周期,在这种情况下,它们在程序执行期间不会被分配/释放,它们总是被分配的。

于 2019-10-31T08:52:54.287 回答
4

优化编译器可以使用许多技巧来确定是否可以为变量分配常量值。您的发现与此一致,如果不需要,无需运行重复代码。

于 2019-10-31T08:45:01.260 回答