2011-02-23 202 views
2

我在.net上学习GC。我想知道,我的整数,浮点数或值类型,存储的静态变量,函数的成员,函数中的值类型都存储在哪里。这些存储在哪里?

任何有关此主题的文档或任何网页链接,请在此处张贴。

谢谢 戒

+0

这真的不相关。这一切都是为你处理的;这是自动内存管理的重点。您看到的有关在堆栈上分配的值类型与在堆上分配的引用类型有关的任何便利规则过于简单并且可能具有误导性。 – 2011-02-23 07:50:07

+0

如果可能的话,请阅读关于堆和堆栈以及对象如何存储的内容,您将清楚地了解内存是如何分配和破坏的 – kobe 2011-02-23 07:51:14

回答

6

我有an article谈论这一点,但你应该真的阅读由Eric Lippert各种博客文章。 "The truth about value types"可能是最重要的一个,以及“堆栈是一个实现细节”(part one; part two)。

从根本上来说,理解垃圾收集在可达性等方面更重要,而不是内存中的内容的实现细节。 可以在性能方面有所帮助,但是您需要不断提醒自己,这是一个实现细节。

+0

+1对那篇文章感谢(你和Eric的)。我有同样的神话:< – 2011-02-23 08:03:54

+0

非常感谢你的链接。Jon,其他的博客,书籍,应该是阅读以获得关于.net框架工作,设计模式的良好知识。 – Harsha 2011-02-23 08:49:19

+2

@Harsha:阅读Eric Lippert博客的所有* Eric是非常明智的,并且写得非常好。 – 2011-02-23 09:01:03

1

enter image description here


注: 乔恩斯基特的Answer是比较正确的
堆栈 内存

堆栈是职责范围内分配给自动变量的内存部分

使用后进先出(LIFO)方法将数据存储在堆栈中。这意味着内存中的存储空间仅在称为堆栈顶端的内存的一端被分配和释放,分配为。堆栈是一段存储器及其相关的寄存器,用于临时存储信息,其中最近存储的项目是首先被检索的信息。

存储器

在另一方面,是用于动态存储器分配存储器的区域。内存块在这种情况下以任意顺序分配和释放。分配模式和块的大小在运行时间之前是未知的。堆通常被程序用于许多不同的目的。

堆栈比堆堆得快,但也更小,更昂贵。

例子:(它对于C虽然不是C#)

 
    int x;      /* static stack storage / main() { int y; / dynamic stack storage / char str; / dynamic stack storage / str = malloc(50); / allocates 50 bytes of dynamic heap storage / size = calcSize(10); / dynamic heap storage */

以上内容Taken from Here

+2

有几处值得注意的例外... – 2011-02-23 07:55:09

+1

您在顶部的一揽子声明非常危险。它表明*所有*值类型值都存储在堆栈中,这完全是不真实的。然后你给出了一个来自C的例子... – 2011-02-23 07:59:43

+0

这也不是C例子。没有'void main()'这样的东西。 – 2011-02-23 08:11:57