memory - 为什么 Rust 重用具有相同值的内存

标签 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);
}

如果第三个赋值包含&3那么代码输出:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a8

如果第三个赋值包含&2(与第二个赋值相同的值)那么代码输出:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a4

如果第三个赋值包含&5(与第一个赋值相同的值)那么代码输出:

0x558e7da926a0
0x558e7da926a4
0x558e7da926a0

为什么 rust 不释放内存,而是在分配值相同时重用它,否则分配新的内存块?

最佳答案

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

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

关于memory - 为什么 Rust 重用具有相同值的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58639442/

相关文章:

rust - Rust,在闭包内创建一个闭包,避免 “closure may outlive the current function”

rust - 如何在 BufReader 中包装实现 Read 和 Write 的结构的读取部分?

module - 为什么 Rust 在子模块中找不到函数?

vector - 尝试索引到 Rust 中的向量时出现 SliceIndex 特征绑定(bind)不满足错误

java - 为什么不会总是发生堆栈溢出?

java - C++ 与 Java 或 C# 中堆内存的回收方式有何区别

generics - 为什么 impl 不在范围内

rust - 为什么我可以将项目推送到我正在使用 while 循环迭代的 Vec 中,但不能使用 for 循环?

memory - 使用什么来查看 Spark 的内存使用情况(使用 YARN)?

c - 确定 C 中动态分配内存的大小