堆栈和堆内存效果?

时间:2011-08-07 11:29:32

标签: c# .net memory-management stack heap

在以下代码中:

MyClass oMyClass1;
MyClass oMyClass2 = null;

我怀疑上述两行将如何影响内存(堆栈和堆)。

会在堆栈中创建引用吗?

2 个答案:

答案 0 :(得分:3)

  

我怀疑上述两行将如何影响内存(堆栈和堆)。

信息不足,有两种可能性:

  1. 它们是局部变量。在那种情况下,这两行在堆栈上进行2次相同的分配(参考,总是32/64位)(无论何时以及执行该方法多长时间)。堆上没有分配。

  2. 它们是类或结构中的字段。在这种情况下,这两行在创建时分别在实例中分配引用的大小。该实例可以在堆栈上(当它们是struct成员时)或在堆(类成员)上分配。

答案 1 :(得分:1)

严格来说,这取决于代码的位置。

如果代码在常规函数/方法中,它将仅影响堆栈。对堆没有影响,因为还没有构造MyClass对象。

假设MyClass是一个类(即引用类型),声明将在堆栈上保留足够的空间来保存对MyClass对象的引用。

这两个声明略有不同 - 第一个声明尚未初始化,因此任何在设置为某个东西之前访问oMyClass1的尝试都会产生编译器错误。第二个是初始化的,所以你不会得到编译器错误[虽然如果你在设置它以引用实际对象之前访问oMyClass2的方法或属性,你将会遇到运行时错误,例如with oMyClass2 = new MyClass();]。

如果代码在类声明中:

class Fred {
    MyClass oMyClass1;
    MyClass oMyClass2 = null;
}

然后它只会在Fred构造函数中执行。在调用构造函数之前,空间(对于Fred对象,包括两个MyClass引用的空间)已经在堆上分配。这两行代码实际上没有任何效果,因为空间已经初始化为null。

如果它在struct声明中,效果将类似,仅在堆栈上(如果struct是local)或全局变量memory(如果struct是静态的)。 [虽然,公平地说,我有点不确定在C#中分配静态的地方 - 我只是假设它以类似于C ++的方式完成]