我试图更深入地了解编程语言的低级操作是如何工作的,尤其是它们如何与OS / CPU交互。我可能已经在Stack Overflow上的每个与堆栈/堆相关的线程中阅读了每个答案,它们都很出色。但是还有一件事我还没有完全理解。
在伪代码中考虑这个函数,它通常是有效的Rust代码;-)
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(a, b);
doAnotherThing(c, d);
}
这就是我假设堆栈看起来像第X行的样子:
Stack
a +-------------+
| 1 |
b +-------------+
| 2 |
c +-------------+
| 3 |
d +-------------+
| 4 |
+-------------+
现在,我所读到的有关堆栈如何工作的所有内容都是严格遵守LIFO规则(后进先出)。就像.NET,Java或任何其他编程语言中的堆栈数据类型一样。
但是如果是这样,那么在X行之后会发生什么?因为显然,我们接下来需要做的是a
和b
,但这意味着OS / CPU(?)必须弹出d
并c
首先返回到a
和b
。但随后它会拍摄自己的脚,因为它需要c
并d
在下一行。
那么,我想知道幕后到底发生了什么?
另一个相关的问题。考虑我们传递了对其他函数之一的引用,如下所示:
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(&a, &b);
doAnotherThing(c, d);
}
根据我的理解,这意味着in doSomething
中的参数实际上指向a
和b
in中相同的内存地址foo
。但是再一次,这意味着直到我们进入a
并b
发生之前,不会弹出堆栈。
这些2案件让我觉得我还没有完全掌握如何准确栈工作,以及如何严格遵循LIFO规则。
LIFO
意味着您只能在堆栈末尾添加或删除元素,并且您始终可以读取/更改任何元素。