这是很长一段时间,因为我试图找出有关静态类的真相。我的观点是:当使用new运算符时,值类型在堆栈中分配,堆中的引用类型。但静态类的本质是你不能创建它的实例,并确定它不是值类型。所以我有一个问题CLR何时何地为静态内容分配内存?关于什么时候......我想在编译期间,当一个组件建成时,但我不确定。 ...当我试图找出J.Richter的“CLR via C#”时,他写道,当你创建一个特定的实例时,实例类的静态方法被分配在堆中。 class(与类型对象指针和同步块索引一起)。但我不明白。它是静态的。它不应该取决于任何对象的状态。所以,请点亮我。
答案 0 :(得分:4)
CLR维护了几个与AppDomain相关联的堆,统称为“loader heap”。它们与垃圾收集堆不同,因为它们不包含可收集的对象,主要是类型相关的数据。 AppDomain生命周期中的数据类型。
静态变量的空间分配在其中一个HighFrequencyHeap中。 JIT编译器进行分配,它生成的代码直接引用内存位置。背景信息在MSDN Magazine article。
中答案 1 :(得分:1)
除了用户堆内存外,CLR还保存了各种簿记信息。堆上的元数据。这包括您执行的方法的实际代码,以及加载到AppDomain中的每个类型的Type对象 - 它的名称,重载,无论是抽象的还是密封的,以及定义的所有方法(静态和实例)的列表类型。
执行方法时,CLR在堆的仅CLR部分的相应Type对象中查找方法信息并执行该方法。实例和静态方法之间的唯一区别是实例方法在方法参数中包含一个额外的“this”指针,指向该方法正在执行的实例。
因此,静态信息与其他所有内容一起存储在堆上,但它与任何特定的对象实例都没有关联。