可能重复:
C++ 中枚举类型数据的大小是多少?
enum 数据类型是如何在内部存储的(我想象为 8/16/32 位 int?),它可以安全地序列化还是应该使用 quint8 之类的东西来存储值?换句话说,sizeof(MyEnum)
保证在所有平台上都是相同的大小?
可能重复:
C++ 中枚举类型数据的大小是多少?
enum 数据类型是如何在内部存储的(我想象为 8/16/32 位 int?),它可以安全地序列化还是应该使用 quint8 之类的东西来存储值?换句话说,sizeof(MyEnum)
保证在所有平台上都是相同的大小?
换句话说,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 的单个枚举器。
当然不。枚举的许多特征是实现定义的。确保选择一个真实的(安全的)类型并将其序列化。
enum 的大小与 相同int
,因此不能保证在所有地方都具有相同的长度。
使用, , , 等stdint.h
中定义的类型之一。int32_t
int16_t
它通常与 int 相同,可以有不同的大小。看到这个答案。