我应该在什么情况下使用它:
enum class MyFixedType : uint32_t // or any other fixed width integer type
{
ID1,
ID2,
ID3
};
对此:
enum class MyType
{
ID1,
ID2,
ID3
};
答案 0 :(得分:4)
一些场景超出了我的头脑,它可能是有用的:
空间有限,你真的不需要标准的int-size枚举。如果您所在的系统中整数以64位格式存储,并且您只有少于255个不同的枚举值,则可能需要指定每个枚举元素需要/需要更少的位。
机器之间的高效通信。假设您知道在两台机器上使用相同的字节顺序,但整数具有不同的默认大小,拥有固定宽度枚举可能更有效,因为您可以传达一些位,而不是序列化消息。
您可能在枚举中有一个重要的顺序,当您添加两个带有运算符的枚举时,您可能想要这样,当您添加2个元素时,结果元素永远不会在您的2个元素之间(这可能发生在你的一部分枚举值是负面的,就像在标准实现中一样。)
我猜大多数这些只在嵌入式案例中很重要。例如,当您需要为微波炉甚至信用卡上的芯片实施程序时,您没有几GB内存的地方,而是几个字节。
答案 1 :(得分:1)
我认为枚举的最大用途是代码清晰度。
假设我们有一个自定义的32位硬件设备,它有3个寄存器:
一个实现可能是这样的:
#include <iostream>
struct SomeDeviceMemoryMap1
{
unsigned int id : 8;
unsigned int status : 8;
unsigned int reserved : 16;
unsigned int color : 32;
};
int main()
{
std::cout << sizeof(SomeDeviceMemoryMap1)<<std::endl;
SomeDeviceMemoryMap1 m1;
m1.id = 1;
m1.status = 5;
m1.color = 33;
}
在c ++ 03中,如果使用了枚举,它将被转换为整数类型。
c ++ 11引入了一种设置枚举大小的方法。上面的例子可以转换成这个:
#include <iostream>
enum class MyFixedType1 : uint8_t
{
ID1=0,
ID2,
ID3
};
enum class MyFixedType2 : uint8_t
{
STATUS1,
STATUS2,
STATUS3=5
};
enum class MyFixedType3 : uint32_t
{
RED,
BLUE = 33,
BLACK
};
struct SomeDeviceMemoryMap2
{
MyFixedType1 id;
MyFixedType2 status;
unsigned int reserved : 16;
MyFixedType3 color;
};
int main()
{
std::cout << sizeof(SomeDeviceMemoryMap2)<<std::endl;
SomeDeviceMemoryMap2 m2;
m2.id = MyFixedType1::ID1;
m2.status = MyFixedType2::STATUS3;
m2.color = MyFixedType3::BLUE;
}