2

可能重复:
C++ 中枚举类型数据的大小是多少?

enum 数据类型是如何在内部存储的(我想象为 8/16/32 位 int?),它可以安全地序列化还是应该使用 quint8 之类的东西来存储值?换句话说,sizeof(MyEnum)保证在所有平台上都是相同的大小?

4

4 回答 4

9

换句话说,sizeof(MyEnum) 是否保证在所有平台上都具有相同的大小?

您可以在 C++11 中设置显式类型(但不能在早期的 C++ 化身中):

enum class Drug : char {
    Cocaine,
    Cannabis,
    Crack
};

或者

enum Sex : uint32_t {
    Male,
    Female,
    Other
};

class顺便说一句,在前面使用enum强制用户Drug拼写它Drug::Cocaine,对于没有在其声明前面的枚举class,拼写是可选的(两者Sex::Male都是Female有效的)。

2011 年之前针对 C++es 的 Hack 包括以下内容,它们强制最小化大小:

enum Frob {
    ...
    FORCE_DWORD          = 0x7fffffff
};

在实践中看到,例如 ReactOS 的DirectX-SDK 实现


标准参考

7.2 枚举声明 [dcl.enum]

[...]

§6:对于底层类型不固定的枚举,底层类型是一个整数类型,可以表示枚举中定义的所有枚举值。如果没有整数类型可以表示所有枚举数值,则枚举格式错误。使用哪种整数类型 作为基础类型由实现定义,除非基础类型不得大于 int,除非枚举数的值不能适合 int 或 unsigned int。如果 enumerator-list 为空,则基础类型就好像枚举有一个值为 0 的单个枚举器。

于 2012-12-21T15:36:08.093 回答
3

当然不。枚举的许多特征是实现定义的。确保选择一个真实的(安全的)类型并将其序列化。

于 2012-12-21T15:36:07.090 回答
1

enum 的大小与 相同int,因此不能保证在所有地方都具有相同的长度。

使用, , , 等stdint.h中定义的类型之一。int32_tint16_t

于 2012-12-21T15:36:25.000 回答
0

它通常与 int 相同,可以有不同的大小。看到这个答案。

于 2012-12-21T15:36:20.260 回答