结构具有逻辑存在性,并且在定义结构变量后才能生效。我想知道枚举的存储方式,它们在声明后立即生效。这仅仅是合乎逻辑的存在吗?
.circle {
width: 100px;
height: 100px;
border-radius: 50%;
margin-bottom: 5px;
}
#red {
background-color: red;
}
我听说枚举没有存储在内存中,所以我的问题是b从何处获取其值。
答案 0 :(得分:3)
b
在编译过程中将其值替换为您的值(在您的情况下为1)。因此,它将以与常量相同的方式处理,并且不可能像变量一样获取其地址。
答案 1 :(得分:2)
建议您查看对象N1570 3.15 object 的定义:
执行环境中的数据存储区域,内容 可以代表值
和恒定 6.4.4(p2):
每个常量的类型取决于其形式和值,例如 稍后详细
因此,未指定常量是否需要在执行环境中存储,因此只能在编译时存在。
由于enumeration constant
是constant
,因此也未为其指定。例如,字符串文字位于.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,它像常量一样被硬编码到内存中。