类对象的内存分配[关闭](Memory allocation of class objects [c

2019-07-22 03:02发布

我一直在问这个问题采访。 请帮我找到它的答案。

假设你有一个Employee类。 有2个变量的原因 - 1.字符串名称2.诠释年龄

现在, Employee emp = new Employee();

现在问的问题是:

  1. 当存储在内存中的对象EMP堆栈或堆以及如何IE浏览器?
  2. 当存储在内存中,以及如何将名字和年龄变量?
  3. 是什么在此声明中的每个单词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,
  4. 是什么上述声明和员工EMP之间的区别; ? 告诉在内存分配方面?

请您宝贵的意见答复。

Answer 1:

  1. 当存储在内存中的对象EMP堆栈或堆以及如何IE浏览器?

现在的问题是措辞不当。 emp不是一个对象 ; emp含有对一个对象的引用变量

因此,让我们改写的问题:

图1(a)如果所述目的是通过称为emp存储在存储器?

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

图1(b) emp是可变的,并且因此代表的存储位置。 哪里是在内存中的存储位置?

这个问题没有给予足够的信息说。 可变emp可能是一个静态字段,实例字段或局部变量。 (它不能是一个正式的参数,因为分号)。如果在本地,它也可以是一个lambda的闭合过外层变量,或本地迭代器块的,或异步方法的。 所有这些都将改变变量的存储是否在短期或长期存储。 如果它是在短期储存它可能是在堆栈上,或者它可以是一个寄存器。

2哪里nameage存储在内存中,以及如何变量?

由于他们是一类的领域,与这些变量相关的存储位置总是在长期堆。

由于name的类型为string ,它指的是东西-一个字符串-也是在堆上。 (或者,变量可以为空,在这种情况下,它并不是指什么。)

3这是什么在这个声明中的每个单词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,

现在的问题是非常严重的措辞。 首先,这些都不是“字”,这些都是“令牌”。 (和()两个符号)。第二,它是完全不清楚的问题是指“做”什么。 因此,让我们问一个不同的问题:

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

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

  • 首先,短期存储被分配用于变量; 它很可能是enregistered; 如果不是,它会在堆栈中。 它被赋予一个空引用。

  • 其次,内存分配器被要求出示空的内存员工对堆一个实例。 它这样做,并产生到存储器中的参考。

  • 第三,如果这是我们见过的员工和员工都有一个静态构造函数的第一次,静态构造函数运行。

  • 四,静态构造函数完成后,员工的字段初始化运行。

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

  • 六,员工的构造函数体中运行。

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

这门课程的所有假设,没有什么沿途抛出异常。

4是什么上面的语句之间的差异Employee emp; ? 告诉在内存分配方面。

这个问题不包含足够的信息来给出一个准确的答案。 如果局部变量从未则使用的编译器就可以优化它拿走。 如果不优化它扔掉然后储存emp被分配掉短期池,初始化为null,并且从未使用过。



Answer 2:

您应该看到: 协议栈的实现细节 , 第一部分和第二部分通过埃里克利珀

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

,因为其由于引用类型Employee是一个类。

2 - 当存储在内存中,以及如何将名字和年龄变量?

他们还保存在堆。 虽然年龄是值类型,但值类型存储它们的容器引用的存储位置。

3 - 什么是在这个语句中的每个词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,

创建的新实例Employee类名为emp

4-是什么上面的语句和员工EMP之间的区别; ? 告诉在内存分配方面?

Employee emp; 意味着只是声明, 没有实例 。 这意味着没有内存分配给对象,将持有null



Answer 3:

当存储在内存中的对象EMP堆栈或堆以及如何IE浏览器?

它分配在堆中 ,因为你说, Employeeclass 。 类是分配在堆。

nameage存储在内存中,以及如何变量?

这取决于你如何使用它们, 可以在不同的框架,实行之间变化。 在一般情况下,想起来,好像他们与对象的内存本身结束。

是什么在此声明中的每个单词做即哪些呢员工do..then emp..then = ..然后..新员工,然后..然后()..然后,

您分配nececssary内存类型Employee ,并将其分配到指针emp 。 指针emp被压入堆栈的基础上,如何使用它。

是什么上述声明和员工EMP之间的区别; ? 告诉在内存分配方面?

Employee emp; 

是一样的写入Employee emp = default(Employee); 和引用类型默认为一个null ,所以这是等于写入Employee emp = null; 。 因此,在分配方面应该不会成为任何区别。

进一步阅读:

C#堆在.NET(荷兰国际集团)与堆栈(荷兰国际集团):第一部分



文章来源: Memory allocation of class objects [closed]