首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类对象的内存分配

类对象的内存分配
EN

Stack Overflow用户
提问于 2013-03-20 10:00:36
回答 3查看 19.1K关注 0票数 8

我在面试中被问到这个问题。请帮我找出答案。

假设你有个班里的员工。其中有两个变量- 1.字符串名2. Int年龄

现在,Employee emp = new Employee();

现在提出的问题是:

  1. 对象emp存储在内存中的位置,即堆栈或堆中,以及如何存储?
  2. 存储在内存中的名称和年龄变量的位置以及如何存储?
  3. 这个语句中的每个单词做什么,即employee do..then emp..then =.然后是新的..。然后雇员..。然后()..then;
  4. 上述声明与员工emp之间有什么区别?从内存分配的角度来讲。

请回答你的宝贵意见。

EN

回答 3

Stack Overflow用户

发布于 2013-03-20 15:19:03

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

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

因此,让我们重提这个问题:

1 (a) emp所指的对象存储在内存中的何处?

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

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

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

2内存中存储的nameage变量在哪里?

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

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

这个语句中的每个词做什么,即雇员do..then emp..then =.然后是新的..。然后雇员..。然后()..then;

这个问题措辞极差。首先,这些不是“单词”,而是“记号”。( ()是两个令牌。)第二,我们完全不清楚“做”这个问题是什么意思。所以让我们问一个不同的问题:

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

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

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

当然,所有这一切都假定一路上没有任何东西会抛出异常。

上述语句与Employee emp;的区别是什么?从内存分配的角度来讲。

这个问题没有包含足够的信息来给出准确的答案。如果局部变量从未被使用过,那么编译器就可以自由地优化它。如果它不优化它,那么emp的存储将从短期池中分配,初始化为null,并且从未使用。

票数 38
EN

Stack Overflow用户

发布于 2013-03-20 10:06:41

您应该看到:The Stack是Eric的一个实现细节第一部分第二部分

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

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

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

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

这个语句中的每个词做什么,即雇员do..then emp..then =..。然后是新的..。然后雇员..。然后()..then;

创建Employee类的新实例,名为emp

4-上述声明与员工emp之间的区别是什么?从内存分配的角度来讲。

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

票数 7
EN

Stack Overflow用户

发布于 2013-03-20 10:11:36

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

它是在堆上分配的,正如您所说的,Employee是一个class。类在堆上分配。

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

这取决于您如何使用它们,并可能因框架的不同实现而有所不同。一般来说,把它想成是以对象的内存结束。

这个语句中的每个单词做什么,即employee do..then emp..then =.然后是新的..。然后雇员..。然后()..then;

您为类型Employee分配了必要的内存,并将其分配给指针emp。根据指针emp的使用方式,将指针推到堆栈或堆上。

上述声明与员工emp之间有什么区别?从内存分配的角度来讲。

代码语言:javascript
运行
复制
Employee emp; 

与写入Employee emp = default(Employee);相同,对于引用类型,默认值为null,因此这等于写入Employee emp = null;。因此,在分配方面,不应有任何不同。

请进一步阅读:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15520378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档