As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




已关闭8年。




面试中有人问我这个问题。请帮助我找到答案。

假设您有一个Employee类。其中有2个变量-1.字符串名称2. Int Age

现在,Employee emp = new Employee();
现在问的问题是:
  • 对象emp存储在内存中的位置,即堆栈或堆中的位置,怎么办?
  • 姓名和年龄变量在哪里存储在内存中以及如何存储?
  • 此语句中的每个单词都执行什么操作,即员工的工作是什么。.然后emp..then = ..然后是新的..然后是员工..然后().. then;
  • 上述陈述与employee emp有什么区别; ?说说内存分配。

  • 请回复您的宝贵意见。

    最佳答案



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

    因此,让我们重新思考一下这个问题:



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



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



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

    由于name的类型为string,因此它所指的内容(字符串)也位于堆中。 (或者,变量可以为null,在这种情况下,它不指向任何内容。)



    这个问题措辞极差。首先,那些不是“单词”,那些是“ token ”。 (并且()是两个标记。)其次,完全不清楚该问题对“do”意味着什么。因此,让我们问一个不同的问题:



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

  • 首先,为变量分配短期存储;它很可能已注册;如果没有,它将放在堆栈中。为它分配了一个空引用。
  • 其次,要求内存分配器为堆上的Employee实例生成空内存。这样做并生成对该内存的引用。
  • 第三,如果这是我们第一次看到Employee并且Employee具有静态构造函数,则将运行静态构造函数。
  • 第四,在静态ctor完成后,将运行Employee的字段初始化程序。
  • 第五,运行Employee的基类构造函数。这可能会导致其他静态构造函数执行。
  • 第六,运行Employee的构造函数主体。
  • 第七,构造函数完成,并将对现在初始化的对象的引用复制到其存储中。

  • 当然,所有这些都假定在此过程中没有任何异常。



    该问题所包含的信息不足,无法给出准确的答案。如果从未使用局部变量,则编译器可以自由地对其进行优化。如果没有对其进行优化,那么emp的存储将在短期池之外分配,初始化为null,并且从不使用。

    关于c# - 类对象的内存分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15520378/

    10-13 07:55