自从我试图找出关于静态类的真相以来已经有很长时间了。我的观点是:使用 new 运算符时,值类型在堆栈中分配,在堆中分配引用类型。但是静态类的本质是您不能创建它的实例,并且确保它不是值类型。所以我有一个问题,CLR 何时何地为静态内容分配内存?关于什么时候......我想在编译期间,什么时候构建程序集,但我不确定。关于在哪里...当我试图找出我阅读 J.Richter 的“通过 C# 的 CLR”时,他写道,当您创建该特定实例的实例时,实例类的静态方法是在堆中分配的类(连同类型对象指针和同步块(synchronized block)索引)。但我不明白。它是静态的。它不应该依赖于对象的任何状态。所以请减轻我的负担。
最佳答案
CLR 维护多个与 AppDomain 关联的堆,统称为“加载器堆”。它们与垃圾收集堆不同,因为它们不包含可收集对象,主要是与类型相关的数据。在 AppDomain 的整个生命周期中都存在的数据类型。
静态变量的空间分配在其中之一,HighFrequencyHeap。 JIT 编译器进行分配,它生成的代码直接引用内存位置。背景信息在此MSDN Magazine article .
关于.net - 静态类/成员在哪里分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384031/