gpt4 book ai didi

c++ - 无论枚举值的数量如何,枚举大小都是恒定的

转载 作者:IT老高 更新时间:2023-10-28 23:03:42 33 4
gpt4 key购买 nike

为什么 enum 的大小总是 2 或 4 字节(分别在 16 位或 32 位体系结构上),而不管类型中的枚举数是多少?

编译器是否像对待 union 一样对待 enum

最佳答案

在 C 和 C++ 中,enum 类型的大小是实现定义的,并且与某些整数类型的大小相同。

一种常见的方法是使所有 enum 类型的大小与 int 相同,因为这通常是最有效访问的类型。例如,将其设为单个字节会节省非常少量的空间,但可能需要更大且更慢的代码才能访问它,具体取决于 CPU 架构。

在 C 中,枚举 constantsint 类型定义。所以给定:

enum foo { zero, one, two };
enum foo obj;

表达式 zeroint 类型,但 objenum foo 类型,它可以是或可能与 int 的大小不同。鉴于常量是 int 类型,使枚举类型具有相同大小往往更容易。

在 C++ 中,规则不同;常量是枚举类型。但同样,出于效率原因,将每个 enum 类型作为一个“单词”通常是最有意义的,通常是 int 的大小。

2011 ISO C++ 标准增加了为 enum 类型指定底层整数类型的能力。例如,您现在可以编写:

enum foo: unsigned char { zero, one, two };

保证 foo 类型和常量 zeroonetwo 都有大小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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com