C# 用c语言进行堆栈和堆

C# 用c语言进行堆栈和堆,c#,memory,stack,memory-management,heap,C#,Memory,Stack,Memory Management,Heap,可能重复: 谁能告诉我内存分配是如何完成的,即哪个对象存储在堆栈中,哪个对象存储在内存的堆部分?在C#编译器和CLR的Microsoft实现中,当值是临时值、局部变量或形式参数时,值类型存储在堆栈上,它既不是匿名方法的封闭外部变量,也不是迭代器块中的封闭外部变量 当然,如果你不需要的话,为什么要在堆栈上存储东西呢?一些值类型的局部变量根本不会出现在堆栈上;他们一生都在登记簿上 值类型的其他值存储在堆装箱值类型、引用类型的值类型字段等中 值类型当然既不能存储在堆栈上,也不能存储在寄存器上,也不能

可能重复:


谁能告诉我内存分配是如何完成的,即哪个对象存储在堆栈中,哪个对象存储在内存的堆部分?

在C#编译器和CLR的Microsoft实现中,当值是临时值、局部变量或形式参数时,值类型存储在堆栈上,它既不是匿名方法的封闭外部变量,也不是迭代器块中的封闭外部变量

当然,如果你不需要的话,为什么要在堆栈上存储东西呢?一些值类型的局部变量根本不会出现在堆栈上;他们一生都在登记簿上

值类型的其他值存储在堆装箱值类型、引用类型的值类型字段等中

值类型当然既不能存储在堆栈上,也不能存储在寄存器上,也不能存储在托管堆上;它们可以使用完全不受CLR控制的其他内存管理器存储在非托管内存中

(当然,请注意,在“堆栈”中使用“the”会产生微妙的误导;一个流程中可能有许多堆栈,而不必只有一个。)

所有这些都是实施细节,如有更改,恕不另行通知

另外,显然,使用堆栈alloc声明分配的内容是在堆栈上分配的

有关此主题的更多信息,请参阅我的文章:

你为什么在乎?运行时为您管理所有这些细节,这样您就不必担心了。你只是好奇,还是这导致了更大的问题?

3经验法则:

  • 对象存储在堆上。其中包括引用类型和装箱值类型的实例
  • 局部变量和参数存储在堆栈上。对于本地值类型,这意味着值本身存储在堆栈上。对于局部引用类型,只有引用才会在堆栈上(编辑:Eric Lippert注意到的异常-值类型局部变量在外部变量上闭合,迭代器块值类型)
  • 字段存储在包含实例的位置。例如,类的值类型字段将存储在堆上。声明为本地存储在堆栈上的结构的引用类型字段的引用部分也将位于堆栈上

  • 在上面的搜索框中键入“stack heap C#”,您将很快找到所需的信息。规则2是错误的。局部变量和参数并不总是存储在堆栈上。值类型的局部变量(在外部变量上闭合)存储在堆上。如果块是迭代器块,则值类型的所有局部变量都存储在堆上。当然,您忽略了一个事实,即即使是“在堆栈上”的局部变量也可能不在堆栈上。他们可能被注册了。@Eric Lippert:你当然是对的;这就是为什么我急忙补充说这些都是经验法则。@Eric Lippert:另外,考虑到C#编译器对迭代器块所做的工作,你不认为首先将这些方法中声明的变量视为局部变量有点不准确吗?它们怎么不是局部变量?它们是在方法体中声明的变量;根据定义,这是一个局部变量。“局部变量”的定义是否与规范中给出的定义不同?@Eric Lippert:就语言而言,是的。但是局部变量不会最终被转换为编译器生成的私有状态机类中的字段吗?这个“实现细节”对于理解它们为什么会出现在堆上不是很重要吗?“你为什么在意?”:我不能回答提问者的问题,但对我来说,我在一段时间前搜索了这些信息(以及关于堆栈大小的信息),因为我担心如果堆栈上的结构太多,我会出现堆栈溢出异常。