.NET – 函数变量存储在地址空间中的堆或堆栈上?

我在考试中遇到了以下问题:

当程序调用一个函数时,哪种类型的数据结构是为该函数中的变量分配的内存?

  1. 队列
  2. LIFO

根据测试,虽然我选择了STACK,但HEAP是正确的答案。

有人可以在那里出色的人解释原因吗?

提前致谢。

好吧,局部变量和参数存储在堆栈上而不是堆上。 对于本地值类型,这意味着值本身存储在堆栈中。 对于本地引用类型,只有引用将在堆栈上。

然而,为了得到更深入的解释,我建议阅读Erik Lippert的一篇非常好的博客文章(他已经在评论中指出了这篇博文): Stack是一个实现细节,第一部分 。

这是一个写得很糟糕的问题,我想知道写这个问题的人的能力。 正如bejger所回答的那样,在大多数语言中,局部变量(和函数参数)都存储在“堆栈”中。 在诸如C#或Java之类的参考语言中,对象存储在“堆”中,并引用存储在“堆栈”上的对象(指针)。 这个问题很可疑,因为它没有指定语言或确切的方案。 此外,我根本不会调用堆和堆栈“数据结构”。 它们是内存分配方案,而不是此上下文中的数据结构。

首先,C#没有“function”; 它有“方法”。

你是什​​么意思“在哪种类型的数据结构是为该函数中的变量分配的内存?”

Nota Bene:仅仅是为了记录,“LIFO”是一种访问策略(Last-In,First-Out),而不是数据结构。 通常,一个将STACK称为LIFO STACK。 但我离题了。

通常,正确的答案是

  • “这取决于”,或
  • “堆叠和堆积”

局部变量的插槽(仅存在于方法调用的上下文中的变量)在方法调用的持续时间内在堆栈帧内分配,该调用位于程序堆栈中。

如果变量是引用类型 ,则该槽是对实际对象实例的引用 ,当实例化实例化时,将从堆中分配内存。

如果变量是值类型 ,则该插槽[通常但不总是]对象实例本身。 。 。 但这不是一个给定的。 如果需要,值类型可以(并且是)在堆上分配。 在这种情况下,变量的堆栈帧槽与值类型一样,是对堆上分配的实例的引用。