如何计算枚举的大小


typedef enum enumStruc_2 {
ENUM_5 = 0xFFFFFFF0, ENUM_6, ENUM_7, ENUM_8
} enumStruc_2;

在这里,枚举的大小是 4 个字节(整数大小(。它如何在 4 个字节内保存其所有枚举成员值? 无论其成员的值如何,枚举大小是否始终为 4 字节?

这取决于实现enum有多大。 来自 C 标准关于枚举说明符的第 6.7.2.2p4 节:

每个列举的类型应与char、有符号整数类型或无符号整数类型。
类型的选择是实现定义的,但应 能够代表所有成员的价值观 的枚举。 枚举类型不完整,直到 紧跟在终止枚举器列表的}之后 声明,并在此之后完成。

因此,enum类型的大小可以是intchar或任何其他整数类型的大小。 例如,gcc 大小枚举如下所示:

通常,如果 中没有负值,则unsigned int枚举,否则int。如果指定了-fshort-enums,则如果 有负值它是signed char的第一个,shortint可以表示所有值,否则它是第一个unsigned charunsigned shortunsigned int可以代表所有 值。

关于每个成员的价值观,第3段指出:

枚举器列表中的标识符声明为 具有类型int的常量,并且可能出现在允许的任何位置
具有=将其枚举常量定义为常量表达式的值。如果第一个枚举器没有=,其枚举常量的值为 0。每个后续枚举器没有=将其枚举常量定义为通过将 1 加 1 获得的常量表达式的值 上一个枚举常量。(使用调查员=可能会生成枚举常量,其值与同一枚举中的其他值重复。 枚举的枚举器 也称为其成员。

在这种情况下,常量ENUM_5被显式地赋值0xFFFFFFF0,所以ENUM_60xFFFFFFFENUM_70xFFFFFFF2ENUM_80xFFFFFFF3。 这些常量中的每一个都需要 4 个字节来存储值,因此此特定enum的大小必须至少为 4 个字节,尽管它可能更大。

关于:

它如何在 4 个字节内保存其所有枚举成员值?

它不会同时容纳所有 4 名成员。枚举可以容纳这 4 个成员中的一个。您定义的是类型,而不是值。例如:

enum enumStruc_2 e1 = ENUM_5;
enum enumStruc_2 e2 = ENUM_6;

类型的大小不是存储该类型的所有可能值所需的大小。它是存储该类型的一个实例所需的大小。

在 C 和 C++ 中,枚举器sizeof(enumStruc_2)的大小是该枚举中任何单个元素的大小。

在 C 中,答案是sizeof(int)。所以这至少是 2。

在C++,答案是sizeof(std::underlying_type<enumStruc_2>::type).

当你声明一个枚举时,你会做两件事。 首先是声明一个具有枚举名称的新类型。 此类型是一个整数类型,其大小足以存储枚举内使用的值的最大值,并且除非指定,否则它不会小于int

接下来要做的是声明 0 个或多个该类型的常量值。 它们不像类成员变量那样参与枚举的大小,因为它们不是真正的变量。它们只是您可以使用的命名常量,并且具有枚举类型的类型。 这就是为什么你可以拥有尽可能多的枚举值,并且sizeof(enum_name)永远不会改变。

最新更新