在什么情况下我应该在C ++ 11中为枚举类使用固定宽度整数

时间:2014-06-11 15:02:12

标签: c++ c++11 enums

我应该在什么情况下使用它:

enum class MyFixedType : uint32_t // or any other fixed width integer type
{
    ID1,
    ID2,
    ID3
};

对此:

enum class MyType
{
    ID1,
    ID2,
    ID3
};

2 个答案:

答案 0 :(得分:4)

一些场景超出了我的头脑,它可能是有用的:

  1. 空间有限,你真的不需要标准的int-size枚举。如果您所在的系统中整数以64位格式存储,并且您只有少于255个不同的枚举值,则可能需要指定每个枚举元素需要/需要更少的位。

  2. 机器之间的高效通信。假设您知道在两台机器上使用相同的字节顺序,但整数具有不同的默认大小,拥有固定宽度枚举可能更有效,因为您可以传达一些位,而不是序列化消息。

  3. 您可能在枚举中有一个重要的顺序,当您添加两个带有运算符的枚举时,您可能想要这样,当您添加2个元素时,结果元素永远不会在您的2个元素之间(这可能发生在你的一部分枚举值是负面的,就像在标准实现中一样。)

  4. 我猜大多数这些只在嵌入式案例中很重要。例如,当您需要为微波炉甚至信用卡上的芯片实施程序时,您没有几GB内存的地方,而是几个字节。

答案 1 :(得分:1)

我认为枚举的最大用途是代码清晰度。

假设我们有一个自定义的32位硬件设备,它有3个寄存器:

  • 读取和写入id的8位寄存器
  • 8位寄存器读写状态
  • 读取和写入颜色的32位寄存器

一个实现可能是这样的:

#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;
}
相关问题