我正在阅读这个wikibook并且不明白这在局部变量部分中意味着什么? ELI5会很有帮助< 3
答案 0 :(得分:0)
有趣的事实 - 堆栈是一个实现细节,几乎无关紧要。 C#规范中对stack
的大多数引用都是对玩具Stack<T>
的引用,而不是对执行堆栈的引用。
我们采取一种玩具方法:
public int Compute(int value)
{
int b = value/2;
if (b > 10){
return b + Compute(b);
}
return b - 4;
}
此Compute
方法需要某处,它可以存储b
变量的内容。重要的是,这种方法可以 recurse 1 ,也就是说,它可能会重复地调用本身,并且重要的是每次执行该方法都会保留它自己的b
变量副本。如果内存中的b
变量只有一个存储空间,那么就不可能进行递归。 2
因此,必须动态提供变量存储 - 每次输入方法时,必须为局部变量提供新存储。提供这种存储的一种特别常见的方式是通过“堆栈帧”或“激活记录”。 实际需要多少存储需要进行涉及优化和变量生命周期的复杂讨论,但在简单的情况下,我们说堆栈帧包含足够的存储空间用于每个局部变量。
但是,const
本地人是特殊变量 - 因为他们不会变化。作为优化,我们可以只在某处存储此变量的一个副本,并且正在运行的每个Compute
实例都可以引用该单个副本。
1 这里,它是简单的递归,但不一定是这样的 - 递归可以通过对其他方法的一些中间方法调用来隐藏。
2 我们也不能允许多个线程调用该方法。