自从我试图找出关于静态类的真相以来已经有很长时间了。我的观点是:使用 new 运算符时,值类型在堆栈中分配,在堆中分配引用类型。但是静态类的本质是您不能创建它的实例,并且确保它不是值类型。所以我有一个问题,CLR 何时何地为静态内容分配内存?关于什么时候......我想在编译期间,什么时候构建程序集,但我不确定。以及关于在哪里......当我试图找出我阅读 J.Richter 的“通过 C# 的 CLR”时,他写道,当你创建该特定的实例时,实例类的静态方法是在堆中分配的类(连同类型对象指针和同步块索引)。但我不明白。它是静态的。它应该 t 取决于对象的任何状态。所以请减轻我的负担。
问问题
657 次
2 回答
4
CLR 维护多个与 AppDomain 关联的堆,统称为“加载器堆”。它们与垃圾收集堆不同,因为它们不包含可收集对象,主要是与类型相关的数据。在 AppDomain 的整个生命周期中都存在的数据类型。
静态变量的空间分配在其中之一,HighFrequencyHeap。JIT 编译器进行分配,它生成的代码直接引用内存位置。背景信息在这篇MSDN 杂志文章中。
于 2010-08-02T09:11:18.143 回答
1
除了用户堆内存,CLR 在堆上保存各种簿记信息和元数据。这包括您执行的方法的实际代码,以及加载到 AppDomain 中的每个类型的 Type 对象 - 它的名称、重载、无论是抽象的还是密封的,以及定义的所有方法(静态和实例)的列表类型。
当您执行一个方法时,CLR 在堆的仅 CLR 部分上的相应 Type 对象中查找方法信息并执行该方法。实例方法和静态方法之间的唯一区别是实例方法在方法参数中包含一个额外的“this”指针,该指针指向正在执行该方法的实例。
因此,静态信息与其他所有内容一起存储在堆中,但与任何特定对象实例无关。
于 2010-08-01T23:20:43.600 回答