gpt4 book ai didi

rust - 在 Rust 中具有变量阴影的堆栈分配内存会发生什么?

转载 作者:行者123 更新时间:2023-12-03 11:33:53 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is the resource of a shadowed variable binding freed immediately?

(1 个回答)


1年前关闭。




如果我打电话:

fn nothing() -> i32{
let x = 2;
let x = 3;
}
我已经读到在堆栈上分配了一个新地址,并且旧变量的名称“不可访问”(但没有被释放?)。我得到了不好的信息吗?
为什么 Rust 不在堆栈上保留相同的内存部分并.. 改变它? let 没有声明常量或静态,所以这里发生了什么?有没有办法在变量阴影期间拥有多个句柄,例如指向堆栈?
如果是这样,编译器是否可以执行 0 引用计数检查并使用单个 mut 优化多个让,如果它从未被指向,因为根据定义只有名称句柄会改变值?
这仅仅是由于 native 多线程和并发安全设计选择吗?

最佳答案

Did I get bad information?


你的信息是正确的。但是您的原始变量可能会被借用并间接使用,因此它不能简单地无条件地消失:
fn nothing() {
let x = 2;
let p = &x;
let x = 3;
dbg!(*p); //prints 2
}
它与多线程无关。这是一个纯粹的句法特征。从代码生成的角度来看,您的代码与以下内容相同:
fn nothing() -> i32{
let x1 = 2;
let x2 = 3;
//do not use x1 ever again
}
也就是说,阴影不会改变代码的语义。为什么要呢?阴影最简单的定义是它没有什么特别的,只是在语法上隐藏了以前的名字。
如果要重用堆栈内存,只需使用相同的变量:
fn nothing() -> i32{
let mut x = 2;
x = 3;
}
也就是说,如果您的类型不是 Drop那么很有可能你的两个 x重复使用相同的内存。但我的 x1/x2 也是如此,因为它们是等价的。

关于rust - 在 Rust 中具有变量阴影的堆栈分配内存会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64275909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com