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

时间:2014-02-04 19:59:52

标签: c# .net memory stack heap

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

  

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

     
      
  1. HEAP
  2.   
  3. QUEUE
  4.   
  5. LIFO
  6.   
  7. STACK
  8.   

根据测试,HEAP是正确答案,尽管我选择了STACK。

那里有一个出色的人请解释原因吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

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

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

  

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

正确答案通常是

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

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

如果变量是引用类型,则该插槽是实际对象实例的引用,当/如果它是从堆中分配的内存实例

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

然而,为了获得更深入的解释,我建议您阅读Erik Lippert的一篇非常好的博客文章(已经在评论中指出了这篇博文):The Stack Is An Implementation Detail, Part One