当常量局部变量存储在汇编数据区域中时,它是什么意思,而非常量局部变量存储在堆栈中?

时间:2017-05-16 05:28:29

标签: c# constants local-variables

我正在阅读这个wikibook并且不明白这在局部变量部分中意味着什么? ELI5会很有帮助< 3

1 个答案:

答案 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 我们也不能允许多个线程调用该方法。