[英]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
是一个结构时,情况会有所变化:
Professor
是一个引用类型)我有几篇您可能会觉得有用的文章/帖子:
编辑:解决Professor
问题,假设Professor
是 class - 除非明确创建Professor
object,否则Student
中的引用将只是 null。 创建新Student
不会仅仅因为存在该类型的字段而自动创建新Professor
。 对Professor
的引用只是Student
数据的一部分——它存在于id
所在的任何地方——所以如果Student
是 class,那么引用只存在于堆上,如果Student
是结构,那么它取决于Student
的位置值被创建,如上所列。
假设 32 位 CLR(在 64 位 CLR 上的引用将是 64 位)并且只考虑学生的堆分配
class 学生{} class 教授{}
class 学生{}结构教授{}
struct Student{} class 教授{}
结构学生{}结构教授{}
您可以使用GC.GetTotalMemory(true)
调用来测量实例化前后的 memory 消耗以测量堆分配
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.