繁体   English   中英

Memory 分配上 object 创建

[英]Memory allocation on object creation

当我们实例化类/结构 Student 时,它将在堆栈和堆中分配多少 memory?

我猜 id = 4 字节引用(32 位机器)和 name = 4 字节引用和facultyAdvisor = 4 字节引用。 所以堆栈中总共有 12 个字节,实际大小将在堆中。 此堆大小可能会有所不同,具体取决于我们分配给使用 object obj(Student obj = new Student()) 的字段(id、name、facultyAdvisor)的值

struct 也一样,对吗?

public class Student { int id; string name; Professor facultyAdvisor; }

public struct Student { int id; string name; Professor facultyAdvisor; }

首先注意堆栈和堆是实现细节...... object 的大小也是如此。 但是在当前的实现中,当它是 class 时, Student中的字段的所有数据都在堆上。 有一个 object 开销以及用于字段的 memory,但所有这些都将在堆上。

如果您保留对新实例的引用,并且将其保留在未捕获的局部变量中,而不是在迭代器块或异步方法中,则该引用将在堆栈上(在当前实现中),因此它将是 4 32 位 CLR 上的字节。

Student是一个结构时,情况会有所变化:

  • 数据(堆栈或堆)的位置取决于值的使用方式 - 例如,如果它存储在 class 的实例变量中,它将与数据的 rest 一起位于堆上; 如果它在局部变量中(同样,未捕获并且不在迭代器块或异步方法中),那么它将在堆栈中
  • 你没有创建一个单独的object ,只是一个value ,所以没有额外的开销 - 它真的只需要 12 个字节(假设Professor是一个引用类型)

我有几篇您可能会觉得有用的文章/帖子:

编辑:解决Professor问题,假设Professor是 class - 除非明确创建Professor object,否则Student中的引用将只是 null。 创建新Student不会仅仅因为存在该类型的字段而自动创建新Professor Professor的引用只是Student数据的一部分——它存在于id所在的任何地方——所以如果Student是 class,那么引用只存在于堆上,如果Student是结构,那么它取决于Student的位置值被创建,如上所列。

假设 32 位 CLR(在 64 位 CLR 上的引用将是 64 位)并且只考虑学生的堆分配

class 学生{} class 教授{}

  • 堆栈:4 字节
  • 堆:4字节(int)+ 4字节(教授参考)+ 4字节(字符串参考)+ 12字节(对象头)= 24字节

class 学生{}结构教授{}

  • 堆栈:4 字节
  • 堆:4 字节(int)+ 处理器大小 + 4 字节(字符串引用)+ 12 字节(对象头)=?? 字节

struct Student{} class 教授{}

  • 堆栈:4字节(int)+ 4字节(字符串引用)+ 4字节(教授引用)= 12字节
  • 堆:0 字节

结构学生{}结构教授{}

  • 堆栈:4字节(int)+ 4字节(字符串引用)+教授的大小=?? 字节
  • 堆:0 字节

您可以使用GC.GetTotalMemory(true)调用来测量实例化前后的 memory 消耗以测量堆分配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM