我知道引用类型将被垃圾收集。我想知道值类型是否也会从堆栈中收集垃圾?
答案 0 :(得分:31)
目前还不清楚你的问题意味着什么。你能仔细定义“垃圾收集”的含义吗?它是否意味着“是GC算法的输入”,或“通过压缩GC堆来解除分配”,还是什么?
存储在堆栈中的值 - 值类型或引用类型的值 - 是集合算法的根。它们未被收集因为它们是活着的东西,几乎让所有其他东西都活着。
显然,它们不会通过压缩GC堆来解除分配;他们通过弹出堆栈来解除分配。
这会回答你的问题吗?
更新:
我所说的“垃圾收集”是指 如果值类型变量是 发现不被使用了 应用程序然后它将被删除 从堆栈
好吧,我认为我们正在接近一个可回答的问题。现在我们需要通过“从堆栈中删除”来理解你的意思。
堆栈一块预先分配的内存,大小为100万字节。有时我们使用该内存块的一部分来存储值类型的局部变量。你是什么意思“从堆栈中删除”?堆栈的大小永远不会改变;它是预分配内存的一百万字节块。
堆栈分为两个连续的区域,我们将其称为堆栈的“有效”和“无效”部分。在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
我现在有点困惑,阅读你提到的关于“价值”和“价值类型”的内容。我发现很难理解这种差异。
很棘手!我们使用“值”和“引用”这两个词来表示太多的东西。让我总结一下。
变量是存储位置。
每个变量都有类型。类型可以是值类型或引用类型。
存储位置包含值。
值类型变量的值是值类型的值。例如,int是值类型。 int类型的变量的值是int,比如12。
引用类型变量的值是对该类型对象的引用,或者为null。例如,string是引用类型。 string类型的变量的值是对字符串的引用,或者为null。
这就是他们被称为“价值类型”和“参考类型”的原因。值类型的值是类型的实例。引用类型的值是对类型实例的引用。
这现在有意义吗?
答案 1 :(得分:7)
公共语言运行库(CLR)为两个位置的对象分配内存:堆栈和堆。
值类型存储在堆栈中,同时引用存储在堆上的引用类型内容。垃圾收集器的目的是在从堆栈弹出引用时释放分配给堆上引用类型内容的内存。
不是引用类型内容的值类型不会存储在堆上,因此垃圾收集器不会清除它。
See here for a slightly more in depth description of value vs reference types
答案 2 :(得分:1)
假设你的意思是“垃圾收集”,意思是垃圾收集器检查它们是否还活着,然后回收内存,那么答案就是不,它们不是“垃圾收集”。
原因是当堆栈帧被删除时,堆栈上的内存会自动回收。
阅读本文:http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks