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



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

程序调用函数时,在哪种类型的数据结构中 该功能中分配的变量的内存?

  1. 队列
  2. lifo
  3. 堆栈

根据测试,堆是正确的答案,尽管我选择了堆栈。

有人可以解释为什么吗?

预先感谢。

首先,c#没有"函数";它具有"方法"。

您的意思是"在哪种类型的数据结构中为该功能中的变量分配的内存?"

nota bene:仅用于记录," lifo"是一种访问策略(最后,首先), 不是数据结构。通常,一个人将堆栈称为Lifo堆栈。但是我离题了。

正确的答案通常是

  • "这取决于"或
  • "堆栈和堆"

本地变量的插槽(仅在方法调用的上下文中存在的变量)在堆栈框架内分配在方法堆栈中的方法调用的持续时间内。/p>

如果变量为参考类型,该插槽是参考到实际对象实例,当/如果是时,将从堆分配的内存将被分配实例化。

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

这是一个非常糟糕的问题,我想知道写它的人的能力。正如Bejger回答的那样,在大多数语言中,本地变量(和函数参数)存储在"堆栈"上。在诸如C#或Java之类的参考语言中,对象存储在"堆"中,并引用存储在"堆栈"上的对象(指针)。这个问题是可疑的,因为它没有指定语言或确切的情况。另外,我根本不会称堆和堆栈为"数据结构"。它们是内存分配方案,而不是在这种情况下的数据结构。

好吧,本地变量和参数存储在 stack 不在堆上。对于本地值类型,这意味着值本身存储在堆栈上。对于本地参考类型,仅参考将在堆栈上。

尚未获得更深入的解释,我建议阅读Erik Lippert的一篇非常好的博客文章(他已经在评论中指向了此博客文章):堆栈是实施细节,第一部分。

相关内容

最新更新