类对象的内存分配

时间:2013-03-20 10:00:37

标签: c# asp.net class memory allocation

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

假设您有一个Employee类。它有2个变量 - 1.字符串名称2. Int年龄

现在,Employee emp = new Employee();

现在提出的问题是:

  1. 对象emp存储在内存中,即堆栈或堆中以及如何?
  2. 哪里有名称和年龄变量存储在内存中又如何?
  3. 这句话中的每个单词都做了什么,即员工做了什么..然后emp..then = ..然后新..然后雇员..然后()..然后;
  4. 上述声明与Employee emp有何区别; ?告诉内存分配。?
  5. 请回复您的宝贵意见。

3 个答案:

答案 0 :(得分:34)

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

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

让我们重新提出问题:

  

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

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

  

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

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

  

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

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

由于name的类型为string,所以它引用的东西 - 一个字符串 - 也在堆上。 (或者,变量可以为null,在这种情况下,它不引用任何内容。)

  

3本声明中的每个单词都做了什么,即员工做了什么......然后再...然后新..然后雇员..然后()..然后;

问题非常严厉。首先,那些不是“文字”,那些是“代币”。 (()两个令牌。)其次,完全不清楚“do”的含义是什么。那么让我们问一个不同的问题:

  

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

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

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

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

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

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

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

  • 第六,员工的构造函数正在运行。

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

当然,所有这一切都假设一路上没有任何例外。

  

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

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

答案 1 :(得分:6)

您应该看到:堆栈是实施细节Part OnePart Two作者Eric Lippert

  

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

上,因为它是Employee以来的引用类型。

  

2 - 名称和年龄变量存储在内存中的位置如何?

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

  

3 - 本声明中的每个单词都做了什么,即员工是什么   do..then emp..then = .. then new .. then employee .. then().. then;

创建名为Employee

emp类的新实例
  

4-上述声明与员工之间有什么区别?   EMP; ?告诉内存分配。?

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

答案 2 :(得分:0)

  

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

它已在上分配,正如您所说Employeeclass。类在堆上分配。

  

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

这取决于您如何使用它们,可以在不同的框架实现之间变化。一般来说,把它当作对象的记忆本身就好了。

  

这句话中的每个单词都做了什么,即员工做了什么..然后emp..then = ..然后新..然后雇员..然后()..然后;

您为类型Employee分配了nececssary内存,并将其分配给指针emp。根据它的使用方式,指针emp被推送到堆栈

  

上述声明与Employee emp有何区别; ?告诉内存分配。?

Employee emp; 

与编写Employee emp = default(Employee);相同,而参考类型默认为null,因此这等同于编写Employee emp = null;。所以在分配方面, 应该没有任何区别。

进一步阅读:

C# Heap(ing) Vs Stack(ing) in .NET: Part I