[C#] 堆与堆栈分配影响(.NET)


Answers

编辑: 我原来的答案包含过分简单化“结构分配在堆栈”和混淆堆栈vs堆和价值vs参考关心一点,因为他们在C#耦合 )。

对象是否在栈上生存是一个不是很重要的实现细节。 乔恩已经很好地解释了这一点。 在使用类和结构之间进行选择时,更重要的是要认识到引用类型与值类型的工作方式不同。 以下面这个简单的课程为例:

public class Foo
{
   public int X = 0;
}

现在考虑下面的代码:

Foo foo = new Foo();
Foo foo2 = foo;
foo2.X = 1;

在这个例子中,foo和foo2是对同一个对象的引用。 在foo2上设置X也会影响foo1。 如果我们将Foo类更改为一个结构,那就不再是这种情况了 。 这是因为结构不通过引用来访问。 分配foo2实际上是复制。

把东西放在堆栈上的原因之一是垃圾收集器不必清理它。 你通常不应该担心这样的事情。 只是使用类! 现代垃圾收集器做得不错。 一些现代的虚拟机(如java 1.6)甚至可以确定是否安全地分配堆栈上的对象,即使它们不是值类型。

Question

从一个关于堆和堆的SO回答 1 ,它提出了一个问题:为什么知道变量分配的位置很重要?

有人指出另一个答案是堆栈更快。 这是唯一的暗示吗? 有人可以给出一个简单的分配位置更改可以解决问题(例如性能)的代码示例吗?

请注意,这个问题是.NET特定的

1这个问题是从SO中删除的。




在.NET中几乎没有什么可讨论的,因为它不是决定在哪里分配实例的类型的用户。

引用类型始终分配在堆上。 值类型默认分配在堆栈上。 如果值类型是引用类型的一部分,则在例外情况下将其与引用类型一起分配到堆上。 即一个类型的设计者代表用户作出这个决定。

在诸如C或C ++之类的语言中,用户可以决定数据的分配位置,在某些特殊情况下,从堆栈中分配相比从堆中分配要快得多。

这与如何处理C / C ++的堆分配有关。 实际上,在.NET中堆分配是非常快的(除非它触发垃圾收集),所以即使你可以决定分配的位置,我的猜测是差异不会很大。

但是,由于堆是垃圾收集和堆栈不是,所以在某些情况下显然你会看到一些差异,但是由于你在.NET中没有选择,所以它几乎没有关系。