如果不能访问中间元素,我怎么访问栈的中间元素

How did I access the middle element of the stack if you can't access the middle element

我正在阅读 this 文档,它说 堆栈按照获取值的顺序存储值,并以相反的顺序删除值。这称为后进先出。想一想一堆盘子:当你添加更多盘子时,你把它们放在这堆盘子的最上面,当你需要一个盘子时,你从最上面拿一个。从中间或底部添加或移除盘子也不行!

那么这是如何工作的

fn main() {
    let _x = 1;
    let y = 2;
    let _z = 3;
    println!("{}", y);
}

感谢您的帮助,抱歉,如果我遗漏了一些明显的东西。

每个函数都需要特定数量的 RAM 来保存此函数中的所有变量。这些被称为框架。帧是堆叠的,不是其中的变量。 每次调用函数时,都会分配一个新的框架。每次你离开一个函数,这个函数的框架就会被丢弃。

Function-Stack与访问同帧变量无关

首先,他们正在解释调用堆栈 的工作原理。当函数 a() 调用函数 b() 时,您可以想象 a() 在调用堆栈中分配一些内存,b() 也是如此。在执行 b() 时,由 a() 分配的内存保持原样。当 b() returns 和现在 a() 继续执行时,它可以在堆栈上分配更多内存。当一个函数(any 函数)完成时,它的内存被释放。

在调用堆栈中,每个函数的数据都应被视为一个单独的堆栈元素。这些元素称为 堆栈框架 。在您的示例中,您有 3 个变量但只有 1 个元素。

另请注意堆栈帧的大小可变。例如,一帧可能有 7 个变量并占用 48 个字节,而另一帧可能只有 1 个变量,分配 100 KB(例如,想象一个大数组)。

给定堆栈帧中的内存在某种程度上也类似于堆栈,因为您不能像那样从中间插入或弹出变量,因为那样需要其他变量的内存地址转移。但是,您可以读取或写入数据 from/to 整个堆栈帧。即使在像 Rust 这样相对 low-level 的语言中,其中的许多东西对你来说都是隐藏的,但如果你了解底层的工作原理,那肯定会有帮助。