枚举存储在哪里?

时间:2019-02-05 06:28:50

标签: c enums

结构具有逻辑存在性,并且在定义结构变量后才能生效。我想知道枚举的存储方式,它们在声明后立即生效。这仅仅是合乎逻辑的存在吗?

.circle {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  margin-bottom: 5px;
}
#red {
  background-color: red;
}

我听说枚举没有存储在内存中,所以我的问题是b从何处获取其值。

4 个答案:

答案 0 :(得分:3)

b在编译过程中将其值替换为您的值(在您的情况下为1)。因此,它将以与常量相同的方式处理,并且不可能像变量一样获取其地址。

答案 1 :(得分:2)

建议您查看对象N1570 3.15 object 的定义:

  

执行环境中的数据存储区域,内容   可以代表值

恒定 6.4.4(p2):

  

每个常量的类型取决于其形式和值,例如   稍后详细

因此,未指定常量是否需要在执行环境中存储,因此只能在编译时存在。

由于enumeration constantconstant,因此也未为其指定。例如,字符串文字位于.rodata节中,因此可以读取,但是很可能对其进行修改,SEGV(尽管它是UB)。

更具体地说,让我们尝试看一下示例中的.rodata部分。这是objdump -dj .rodata bin_name

Disassembly of section .rodata:

0000000000000720 <_IO_stdin_used>:
 720:   01 00 02 00 25 64 20 25 64 0a 00 25 64 0a 00        ....%d %d..%d..

如您所见,它包含唯一的字符串文字。

答案 2 :(得分:2)

枚举常量是值。它们的行为类似于其他整数值,例如3或-87。编译器根据需要将它们构建到代码中:它们可以被编码为指令中的立即操作数,可以从编译器用来保存常量的内存中加载,也可以构建为在编译时部分或完全求值的表达式。

在C的抽象计算模型中,值没有生存期。只有对象具有生命周期,而值不是对象。 (对象是内存的保留部分,用于表示值。)

答案 3 :(得分:2)

一个标准的枚举通常被实现为int32,编译器会将您的枚举作为int32的同义词处理。一旦为枚举创建了一个值列表,则这些值将作为文字存储在它们的显示名称中(访问名位于枚举声明的时间)。因此,您的枚举最后是一个int32,它像常量一样被硬编码到内存中。