无论枚举类型中枚举值的数量有多少,在16位或32位体系结构上,enum
类型的大小始终为2或4个字节。
enum
是否像union
一样被编译器处理?
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语言没有这个特性,而且老版本的C++编译器也不支持它(除非它们提供了语言扩展功能)。
(接下来是插曲。)
那么如果您有一个枚举常量太大无法容纳在int
中怎么办?您不需要231或甚至215个不同的常量来做到这一点:
#include <limits.h>
enum huge { big = INT_MAX, bigger };
big
的值为 INT_MAX
,通常为 231-1,但最小可以是 215-1(32767)。 bigger
的值隐式为 big + 1
。INT_MAX + 1
值的基础类型来表示 huge
。(假设有这样的类型;如果 int
是64位且没有比它大的整数类型,那么这将不可能。)int
,因此上述操作是无效的。 它违反了 N1570 6.7.2.2p2 中所述的限制:enum
占用 8 位,而一个有 257 个元素的 enum
占用 16 位。但编译器通常会使所有的 enum
大小与一个 int
相同,因为那样可以更有效地访问。 - Keith Thompsonsizeof(enum) == sizeof(int)
而不是 sizeof(char)
。有人不喜欢创建 2^sizeof(int)
个符号常量。 - Grijesh Chauhansizeof(enum)
不一定等于 sizeof(int)
。它可能是 sizeof(enum) == sizeof(some integral type)
,其中 some integral type
取决于枚举的值。 - Nawazchar
范围内,那么有可能会出现 sizeof(enum) == sizeof(char)
的情况。但是并不能保证这一点,完全取决于编译器的决定。 - Adam Rosenfieldsizeof(enum) == sizeof(int)
只在 C 语言中成立。对于 C++,其实现是未定义的。 - 0decimal0enum
类型的基础整型可以是实现定义的,它可以是char
或unsigned char
,只要所有的常量都能够表示在该类型中。C语言枚举类型的常量是int
类型,但是类型本身并非如此。 - Keith Thompson我觉得OP假设枚举是一种存储其中声明的值的集合,这是不正确的。
C/C++中的枚举只是一个具有严格定义值范围的数字变量。枚举名称是数字的一种别名。
枚举中的值数量不会影响其存储大小。存储大小由具体实现定义,但通常为sizeof(int)
。
enum
的大小是“至少足够大以包含声明中指定的任何值的整数类型”。许多编译器将使用一个int
(可能是unsigned
),但有些会根据优化或其他因素使用char
或short
。具有少于128个可能值的enum
将适合于char
(unsigned char
为256),并且您必须拥有32768(或65536)个值才能溢出short
,并且在大多数现代系统上,需要2或4十亿个值才能超越int
。
enum
本质上只是一种更好的定义一堆不同常量的方法。与此相比:#define FIRST 0
#define SECOND 1
...
enum myenum
{ FIRST,
SECOND,
...
};
enum
标识符,并保持统一长度,每个标识符都必须是7个字符,再加上逗号和空格,这意味着源文件本身将达到约20GB。我不认为有许多编译器会愉快地尝试处理这个问题... - twalbergenum too_big { big = INT_MAX, bigger };
@LorenPechtel:enum too_big { big = INT_MAX, bigger };
- Keith Thompson