- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
为什么 enum
的大小总是 2 或 4 字节(分别在 16 位或 32 位体系结构上),而不管类型中的枚举数是多少?
编译器是否像对待 union
一样对待 enum
?
最佳答案
在 C 和 C++ 中,enum
类型的大小是实现定义的,并且与某些整数类型的大小相同。
一种常见的方法是使所有 enum
类型的大小与 int
相同,因为这通常是最有效访问的类型。例如,将其设为单个字节会节省非常少量的空间,但可能需要更大且更慢的代码才能访问它,具体取决于 CPU 架构。
在 C 中,枚举 constants 由 int
类型定义。所以给定:
enum foo { zero, one, two };
enum foo obj;
表达式 zero
是 int
类型,但 obj
是 enum foo
类型,它可以是或可能与 int
的大小不同。鉴于常量是 int
类型,使枚举类型具有相同大小往往更容易。
在 C++ 中,规则不同;常量是枚举类型。但同样,出于效率原因,将每个 enum
类型作为一个“单词”通常是最有意义的,通常是 int
的大小。
2011 ISO C++ 标准增加了为 enum
类型指定底层整数类型的能力。例如,您现在可以编写:
enum foo: unsigned char { zero, one, two };
保证 foo
类型和常量 zero
、one
和 two
都有大小1个字节。 C 没有此功能,并且旧的 2011 之前的 C++ 编译器不支持它(除非它们将其作为语言扩展提供)。
(题外话。)
那么,如果您的枚举常量太大而无法放入 int
中怎么办?您不需要 231 甚至 215 不同的常量来执行此操作:
#include <limits.h>
enum huge { big = INT_MAX, bigger };
big
的值为INT_MAX
,一般为231-1,但也可以小到215 -1 (32767)。 bigger
的值隐含为 big + 1
。
在 C++ 中,这是可以的;编译器将简单地为 huge
选择一个大到足以容纳值 INT_MAX + 1
的基础类型。 (假设有这样一种类型;如果 int
是 64 位,并且没有比这更大的整数类型,那是不可能的。)
在 C 中,由于枚举常量的类型是 int
,所以上面的内容是无效的。它违反了 N1570 中所述的约束。 6.7.2.2p2:
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int.
因此编译器必须拒绝它,或者至少警告它。例如,gcc 说:
error: overflow in enumeration values
关于c++ - 无论枚举值的数量如何,枚举大小都是恒定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17888322/
我是一名优秀的程序员,十分优秀!