【问题标题】:How to remove a value type from the stack?如何从堆栈中删除值类型?
【发布时间】:2016-09-02 23:03:45
【问题描述】:

我正在尝试研究 CLR 内部的细节,其中一件对我来说可能听起来很明显的事情并不适合我:

如何从堆栈中清除值类型?

我知道 GC 会清除堆栈中没有地址的所有堆,但我读到它并没有清除堆栈分配值类型。

有什么想法吗?

【问题讨论】:

  • 我不明白这个问题。
  • 我觉得涉及到:GC是如何清栈的?
  • 值类型不会被 GC 跟踪,除非它们被装箱,此时它们不再是值类型。这意味着它们不需要任何清理。

标签: .net memory-management clr


【解决方案1】:

我不确定我是否理解您的问题,但我会尽力回答并希望对您有所帮助。

一般来说,要从堆栈中清除值,有一个称为pop 的操作。因此,要删除值类型的值或引用类型的值,您需要弹出它。反之亦然是push 向堆栈添加值。

(我写了“一般”,因为它适用于所有基于堆栈的数据结构,而不仅仅是 CLR 堆栈。)

您需要了解的另一件事是,与堆不同的堆栈不是通过压缩内存区域来收集的,堆栈是预先分配的内存块,并且值在需要时被推入和弹出。

如果您想知道堆栈内存的外观以及寄存器使用等的确切细节,您可以在 google 上找到一些链接,但我认为这不是您要查找的内容。

【讨论】:

    【解决方案2】:

    通常,堆栈分配是通过递减堆栈指针寄存器中的值来执行的。要释放堆栈位置,堆栈指针会递增。堆栈指针递增或递减的字节数分别取决于要分配或释放的变量的大小。 JIT 编译器根据需要发出机器指令来操作堆栈指针。

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多