.NET – 函数变量存储在地址空间中的堆或堆栈上?
我在考试中遇到了以下问题:
当程序调用一个函数时,哪种类型的数据结构是为该函数中的变量分配的内存?
- 堆
- 队列
- LIFO
- 堆
根据测试,虽然我选择了STACK,但HEAP是正确的答案。
有人可以在那里出色的人解释原因吗?
提前致谢。
好吧,局部变量和参数存储在堆栈上而不是堆上。 对于本地值类型,这意味着值本身存储在堆栈中。 对于本地引用类型,只有引用将在堆栈上。
然而,为了得到更深入的解释,我建议阅读Erik Lippert的一篇非常好的博客文章(他已经在评论中指出了这篇博文): Stack是一个实现细节,第一部分 。
这是一个写得很糟糕的问题,我想知道写这个问题的人的能力。 正如bejger所回答的那样,在大多数语言中,局部变量(和函数参数)都存储在“堆栈”中。 在诸如C#或Java之类的参考语言中,对象存储在“堆”中,并引用存储在“堆栈”上的对象(指针)。 这个问题很可疑,因为它没有指定语言或确切的方案。 此外,我根本不会调用堆和堆栈“数据结构”。 它们是内存分配方案,而不是此上下文中的数据结构。
首先,C#没有“function”; 它有“方法”。
你是什么意思“在哪种类型的数据结构是为该函数中的变量分配的内存?”
Nota Bene:仅仅是为了记录,“LIFO”是一种访问策略(Last-In,First-Out),而不是数据结构。 通常,一个将STACK称为LIFO STACK。 但我离题了。
通常,正确的答案是
- “这取决于”,或
- “堆叠和堆积”
局部变量的插槽(仅存在于方法调用的上下文中的变量)在方法调用的持续时间内在堆栈帧内分配,该调用位于程序堆栈中。
如果变量是引用类型 ,则该槽是对实际对象实例的引用 ,当实例化实例化时,将从堆中分配内存。
如果变量是值类型 ,则该插槽[通常但不总是]对象实例本身。 。 。 但这不是一个给定的。 如果需要,值类型可以(并且是)在堆上分配。 在这种情况下,变量的堆栈帧槽与值类型一样,是对堆上分配的实例的引用。