为什么 Rust 重用具有相同值的内存
Why does Rust reuse memory with same value
示例代码:
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
引用它。常量可能(见注释)也有一个静态生命周期,在这种情况下它们在程序执行期间不是allocated/deallocated,它们总是被分配。
示例代码:
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
引用它。常量可能(见注释)也有一个静态生命周期,在这种情况下它们在程序执行期间不是allocated/deallocated,它们总是被分配。