如果不能访问中间元素,我怎么访问栈的中间元素
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 的语言中,其中的许多东西对你来说都是隐藏的,但如果你了解底层的工作原理,那肯定会有帮助。
我正在阅读 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 的语言中,其中的许多东西对你来说都是隐藏的,但如果你了解底层的工作原理,那肯定会有帮助。