在N2347的示例中,如果新的强类型枚举(C ++ 11)与当前(C ++ 03)进行比较的一个优点是通过带有“旧”枚举的示例来解释:
enum Version { Ver1 = 1, Ver2 = 2 };
struct Packet {
Version ver;
// ... more data ...
// bad, size can vary by implementation
Version getVersion() const { return ver; }
};
我想知道:这里的“变化”意味着编译器甚至可以选择8位表示,即枚举元素只占用一个单词?或者保证最小长度,选项可能只在int
和long
之间?
换句话说,如果我有这样的Version
枚举:
enum VersionXyz { Ver1 = 100, Ver2 = 200 };
struct Packet {
VersionXyz ver;
// ... more data ...
};
这可能只在8bit
中占用Packet
。并在软件更新后:
enum VersionXyz { Ver1 = 100, Ver2 = 200, Ver3=300 };
现在Packet
已经不再具有相同的尺寸因为枚举已经增长了吗?
答案 0 :(得分:6)
C ++ 03标准的相关段落是§7.2.5:
枚举的基础类型是可以表示所有枚举器值的整数类型 在枚举中定义。 实现定义了哪个整数类型用作底层类型 对于枚举,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int。如果枚举器列表为空,则基础类型为 好像枚举有一个值为0的枚举器。应用于枚举类型,枚举类型的对象或枚举器的sizeof()的值是应用于该值的sizeof()的值 基础类型。
所以它的实现是定义的。您唯一可以保证的是,如果您定义一个枚举,其中所有值都适合int
,则枚举类型的大小不会大于int
。 (但由于int
的大小也是实现定义的,因此不会给你太多。)
答案 1 :(得分:0)
如果你知道你的枚举列表只是一个特定的大小,那么在使用它时可能值得输入它,并且如果超过这个大小也有一个断言,至少这就是我在使用枚举时的方式发送数据包