静态、常量和只读字段的内存分配在哪里?

5

我在程序中使用了三个字段,并得到了它们的使用差异,但我有点困惑这些字段存储在哪里?它们是存储在数据段(堆栈或堆)还是代码段中?

static int a;
const int b=1235;
readonly int c;

在ILDASM中,字段描述如下:
对于静态字段:.field private static int32 a
对于常量:.field private static literal int32 b = int32(0x000004D3)
对于只读字段:.field private initonly int32 c

1
https://dev59.com/yWox5IYBdhLWcg3wzng0 可能是一个很好的起点... - Alexei Levenkov
3个回答

2

每个静态变量都存储在堆上,无论它是在引用类型还是值类型中声明的。无论创建了多少实例,总共只有一个插槽。(尽管不需要为那个插槽创建任何实例。)变量存在于哪个堆上的细节非常复杂。更多信息请参见这里


谢谢你回答,你能解释一下内存分配常量和只读字段吗? - user10841478
1
@gurunagsai,显然你已经查看了常量被归类为静态成员,所以这部分是清楚的,readonly不会改变分配 - 所以对于静态只读字段,这篇文章也已经回答了(假设你已经知道实例字段如何存储)。 - Alexei Levenkov
@AlexeiLevenkov 感谢您的回答。 - user10841478

2

1
谢谢你的回答。 - user10841478
我个人感到好奇的一件事情是:readonly 和 private / public 等修饰符相似吗?它只是 .NET 编译器提供的一个帮助工具吗?即使值被声明为 private,仍然可以通过反射从外部修改私有值。那么 readonly 是否也一样呢? - Jannik
@Jannik 只读属性只能在运行时或使用非静态构造函数进行修改。 - Akarsha Rao
这有点误导性。const字段已经编译进代码中了。说常量成员存储在堆中是有误导性的;它们有可能只存储在代码页中,并且通常会被编译器内联。 - Brian

0

CLR是.NET Framework的基本和虚拟机组件。它是.NET Framework中的运行时环境,可以运行代码并通过提供各种服务来帮助简化开发过程。CLR将内存分为三个不同的区域:堆栈、堆和高频堆。静态对象需要在GC收集中存活,并存储在高频堆中。静态和常量对象存储在加载器堆中,因为它们在应用程序的整个生命周期中存在于内存中;它们不需要进行垃圾回收。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接