值类型是否收集了垃圾?

csh*_*aby 19 .net garbage-collection

我知道引用类型将被垃圾收集.我想知道值类型是否也会从堆栈中收集垃圾?

Eri*_*ert 34

目前还不清楚你的问题意味着什么.你能仔细定义"垃圾收集"的含义吗?它是否意味着"是GC算法的输入",或"通过压缩GC堆来解除分配",或者是什么?

存储在堆栈中的值 - 无论是值类型的值还是引用类型 - 都是集合算法的.他们没有被收集,因为他们是活着的东西,几乎所有其他东西都活着.

显然,它们不会通过压缩GC堆来解除分配; 他们通过弹出堆栈来解除分配.

这是否回答你的问题?

更新:

我所说的"垃圾收集"是指,如果发现值类型变量不被应用程序使用,那么它将从堆栈中删除

好的,我认为我们正在接近一个可回答的问题.现在我们需要通过"从堆栈中删除"来理解你的意思.

堆栈是一块预先分配的内存,大小为一百万字节.有时我们使用该内存块的一部分来存储值类型的局部变量.你是什​​么意思"从堆栈中删除"?堆栈的大小永远不会改变; 它是预分配内存的一百万字节块.

堆栈分为两个连续的区域,我们将其称为堆栈的"有效"和"无效"部分.在x86架构上,ESP寄存器指向这些区域之间的边界.您是否在"根据x86架构上ESP寄存器值的变化,在什么条件下,堆栈上与值类型的特定局部变量关联的内存成为无效段的一部分?"

这可能看起来像是一个非常非常"实现细节"的问题版本.堆栈是运行时特定版本的实现细节,因此,如果您要询问有关它的问题,您将不得不接受这样一个事实,即您要询问特定寄存器中的特定值.特定的芯片架构.

进一步阅读:

http://blogs.msdn.com/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

我现在有点困惑,阅读你提到的关于"价值"和"价值类型"的内容.我发现很难理解这种差异.

这很棘手!我们使用"值"和"引用"这两个词来表示太多的东西.让我总结一下.

变量是存储位置.

每个变量都有一个类型.类型可以是值类型引用类型.

存储位置包含.

值类型变量的值是值类型的值.例如,int是值类型.int类型的变量的值是int,比如12.

引用类型变量的值是对该类型对象的引用,或者为null.例如,string是引用类型.string类型的变量的值是对字符串的引用,或者为null.

这就是为什么他们被称为"价值类型"和"参考类型".值类型的值是类型的实例.引用类型的值是对类型实例的引用.

这有意义吗?


Rus*_*ngs 8

公共语言运行库(CLR)在两个位置为对象分配内存:堆栈和堆.

值类型存储在堆栈中,同时引用存储在堆上的引用类型内容.垃圾收集器的目的是在从堆栈弹出引用时释放分配给堆上引用类型内容的内存.

不是引用类型内容的值类型不会存储在堆上,因此垃圾收集器不会清除它.

有关值与引用类型的更深入描述,请参见此处

请参阅此处以获取更多深入描述

  • 值类型不一定存储在堆栈中.正确的语句是"值类型的值,它们是临时存储或本地变量,不是匿名方法或lambda表达式的本地化,并且不在迭代器块中,而是存储在CLI的Microsoft实现中的堆栈上. " 垃圾收集器不会清除GC堆上不存在的值类型.垃圾收集器清除GC堆*上的*是*的值类型. (4认同)