8

我在采访中被问到这个问题。请帮我找到答案。

假设您有一个 Employee 类。其中有 2 个变量 - 1. String Name 2. Int Age

现在,Employee emp = new Employee();

现在提出的问题是:

  1. 对象 emp 存储在内存中的位置,即堆栈或堆中以及如何存储?
  2. name 和 age 变量存储在内存中的位置又如何?
  3. 该语句中的每个单词是做什么的,即employee 做什么..then emp..then =.. then new.. then employee.. then ()..then ;
  4. 上面的语句和Employee emp有什么区别;? 告诉内存分配。?

请回复您的宝贵意见。

4

3 回答 3

38
  1. 对象 emp 存储在内存中的位置,即堆栈或堆中以及如何存储?

这个问题措辞不好。emp不是对象emp是一个包含对对象的引用的变量

所以让我们改写这个问题:

1 (a) 引用的对象emp在内存中存储在哪里?

变量所指的对象emp存储在长期存储中,也称为“堆”。

图1(b)emp是一个变量,因此代表一个存储位置。该存储位置在内存中的什么位置?

这个问题没有提供足够的信息来说明。变量emp可以是静态字段、实例字段或局部变量。(由于分号,它不能是形式参数。)如果是局部变量,它也可以是 lambda 的封闭外部变量,或迭代器块的局部变量,或异步方法的局部变量。所有这些都会改变变量的存储是短期存储还是长期存储。如果它在短期存储中,它可能在堆栈上,也可能是一个寄存器。

2nameage变量存储在内存中的什么位置以及如何存储?

由于它们是类的字段,因此与这些变量关联的存储位置始终位于长期堆上。

由于name是 type string,它所指的东西——一个字符串——也在堆上。(或者,变量可能为空,在这种情况下它不引用任何东西。)

3 此语句中的每个单词是做什么的,即employee 做什么..then emp..then =.. then new.. then employee.. then ()..then ;

这个问题措辞非常糟糕。首先,那些不是“词”,那些是“令牌”。(并且()两个标记。)其次,完全不清楚这个问题的“做”是什么意思。所以让我们问一个不同的问题:

3 详细描述此声明在运行时执行时执行的操作。

我们不能准确地说,因为问题中没有足够的信息。问题说它是一个声明,所以它不是一个字段声明。为简单起见,我们假设它不在迭代器块或异步方法中,并且 local 不是任何匿名函数的外部变量。

  • 首先,为变量分配短期存储;它很可能被注册;如果没有,它将在堆栈上。它被分配了一个空引用。

  • 其次,要求内存分配器为堆上的 Employee 实例产生空内存。它这样做并产生对该内存的引用。

  • 第三,如果这是我们第一次看到 Employee 并且 Employee 有一个静态构造函数,那么静态构造函数就会运行。

  • 第四,静态 ctor 完成后,Employee 的字段初始化程序运行。

  • 第五,Employee 的基类构造函数运行。这可能会导致其他静态构造函数执行。

  • 第六,Employee的构造函数体运行。

  • 第七,构造函数完成,对现在初始化对象的引用被复制到它的存储中。

当然,所有这一切都假设在此过程中没有任何事情引发异常。

4 上面的语句和 有什么区别Employee emp;?告诉内存分配。

该问题没有包含足够的信息来给出准确的答案。如果从未使用过局部变量,则编译器可以自由地对其进行优化。如果它没有优化它,那么存储空间emp会从短期池中分配出来,初始化为 null,并且永远不会使用。

于 2013-03-20T15:19:03.773 回答
7

你应该看到:堆栈是一个实现细节第一部分第二部分,作者:Eric Lippert

1 - 对象 emp 存储在内存中的位置,即堆栈或堆中以及如何存储?

heap上,因为它是一个引用类型,因为它Employee 是一个类。

2 - name 和 age 变量在哪里存储以及如何存储在内存中?

它们也存储在堆上。虽然 age 是一个值类型,但值类型存储在其容器引用所在的位置。

3 - 此语句中的每个单词是做什么的,即雇员做什么..然后 emp..then =.. 然后 new.. 然后雇员.. 然后 ()..then ;

创建一个Employee名为的类的新实例emp

4- 上述声明与Employee emp有什么区别;? 告诉内存分配。?

Employee emp;意味着只是声明,而不是实例化。这意味着没有为对象分配内存,它将保存null.

于 2013-03-20T10:06:41.063 回答
0

对象 emp 存储在内存中的位置,即堆栈或堆中以及如何存储?

它是在heap上分配的,正如你所说Employee的那样class。类在堆上分配。

nameage变量存储在内存中的位置以及如何存储?

这取决于您如何使用它们,并且在不同的框架实现之间可能会有所不同一般来说,把它想象成它们以对象的内存本身结束。

该语句中的每个单词是做什么的,即employee 做什么..then emp..then =.. then new.. then employee.. then ()..then ;

您为该类型分配了必要的内存Employee并将其分配给指针emp。指针emp被推送到stackheap上,具体取决于它的使用方式。

上面的语句和Employee emp有什么区别;? 告诉内存分配。?

Employee emp; 

与 writing 相同 Employee emp = default(Employee);,对于引用类型,默认值为 a null,因此等于 writing Employee emp = null;。所以在分配方面应该没有任何区别。

进一步阅读:

.NET 中的 C# 堆(ing)与堆栈(ing):第一部分

于 2013-03-20T10:11:36.720 回答