【问题标题】:Can anyone explain diagrammatically how enum is stored in memory?谁能用图表解释枚举是如何存储在内存中的?
【发布时间】:2019-01-05 08:26:33
【问题描述】:

Enumeration 数据类型是如何存储在内存中的?枚举真的是存储在内存中的栈中吗?枚举的每个值是如何访问的?

我浏览过很多博客都说枚举不存储在堆栈中。它们不需要内存来存储?

【问题讨论】:

  • 完全像一个 int。没有区别。
  • 如果我们有enum Name: [type = int] { * }Name x - 如果recure 的大小与type 完全相同,默认为int,并且可以根据Name x 贴花的位置存储在任何地方。如果它声明为局部变量 - 将存储在堆栈中
  • .Net 平台是这样吗..
  • 是的,这是真的。
  • 枚举是以块的形式存储在堆栈中还是作为单独的实体单独存储。如果这些是单独存储的,如何访问它们?

标签: c# memory


【解决方案1】:

枚举是对编译器推断的数字数据类型的解释(通常是整数,但您可以更改它)。

编译器会为您定义的每个枚举引入一种新类型。新定义的类型是特殊的,因为您不能继承自,并且包含可用于转换它的运算符和整数类型。

从内存的角度来看,枚举存储在一个整数类型的值中,能够包含您声明的所有值。

CLR 将此作为基础服务提供,因此像 c# 这样的语言具有这种行为。这可能不是每个人的规则。网络支持的语言。

由于枚举类型作为整数类型处理,因此它们作为各自的数据类型存储在堆栈和寄存器中:标准枚举通常实现为 int32;这意味着编译器会将您的枚举作为 int32 的同义词处理(为简单起见,我省略了几个细节)。因此,您的枚举最后是 int32。

如果要控制枚举的实现方式,可以这样声明:

enum MyEnum: byte{}

在上面的例子中,MyEnum 是一个字节,因此编译器会将它当作一个字节来处理。

【讨论】:

  • 枚举如何存储在堆栈中?
  • 我编辑了答案以包含您所看到的内容。如果您需要更多,请告诉我。
  • 枚举是以块的形式存储在堆栈中还是作为单独的实体单独存储。如果这些是单独存储的,如何访问它们?
  • 一个枚举可以取的值,比如A、B和C,被转换成0、1和2这样的整数。枚举本身确实是一个整数。整数作为 4 个字节放置在堆栈中,按平台要求对齐。不存储实体,因为只存储值。如果使用位域,位域允许 32 或 64 个最大值,每个值都变成 2 的幂
  • 你的解释对我很有帮助。谢谢!!
【解决方案2】:

枚举是存储的常量。
一旦为枚举创建了值列表,这些值就会存储为相对于其显示名称的文字(在声明枚举时给出的访问名称)。 Yennerfer's answer 适合存储。 检查 ILDASM 工具以检查 IL 代码中的枚举文字。

【讨论】:

    【解决方案3】:

    枚举不在内存中分配——它们只存在于编译阶段。在您的示例中,它们只存在告诉编译器星期二的值是什么。当代码运行时 - 不再有枚举。

    和下面的一样

    #define Monday 0;
    #define Tuesday 1;
    .
    .
    .
    .
    #define Sunday 6;
    

    但我们更喜欢枚举而不是定义,因为使用枚举比使用#defines 更容易支持和阅读代码。

    你可以通过这个Stackoverflow answer了解枚举大小

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2022-06-11
      • 2022-11-10
      • 2011-03-28
      相关资源
      最近更新 更多