.net - 静态类/成员在哪里分配?

标签 .net memory-management static-classes

自从我试图找出关于静态类的真相以来已经有很长时间了。我的观点是:使用 new 运算符时,值类型在堆栈中分配,在堆中分配引用类型。但是静态类的本质是您不能创建它的实例,并且确保它不是值类型。所以我有一个问题,CLR 何时何地为静态内容分配内存?关于什么时候......我想在编译期间,什么时候构建程序集,但我不确定。关于在哪里...当我试图找出我阅读 J.Richter 的“通过 C# 的 CLR”时,他写道,当您创建该特定实例的实例时,实例类的静态方法是在堆中分配的类(连同类型对象指针和同步块(synchronized block)索引)。但我不明白。它是静态的。它不应该依赖于对象的任何状态。所以请减轻我的负担。

最佳答案

CLR 维护多个与 AppDomain 关联的堆,统称为“加载器堆”。它们与垃圾收集堆不同,因为它们不包含可收集对象,主要是与类型相关的数据。在 AppDomain 的整个生命周期中都存在的数据类型。

静态变量的空间分配在其中之一,HighFrequencyHeap。 JIT 编译器进行分配,它生成的代码直接引用内存位置。背景信息在此MSDN Magazine article .

关于.net - 静态类/成员在哪里分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3384031/

相关文章:

c++ - 如何在C++中实现静态类?

c# - 可以从 xml 返回成员值的类

c++ - 为什么有效? C++内存管理

c - 在 C 中分配的指针上 malloc 安全吗?

c# - 带有数据网格和数据表单的可查询 CollectionView - 选择已更改的问题

c# - 使用 ExpertPDF 从 HTML 生成的 PDF 的质量差异

c - 内存的动态分配

c# - 什么是 "static"类?

c# - 使用 linq 连接查询得到错误的输出

c# - 表内表的CSS