Enum Size *在实践中*

时间:2016-05-18 07:35:52

标签: c++

对于2011年之前的C ++,该标准表示枚举可以是任何大小,从字节到长。但在实践中,似乎大多数编译器都将它们整理为4个字节。

那么,在实践中做任何模糊的当前编译器都不会使它们成为整体?

我似乎需要澄清一点,我没有做任何奇怪的事情,比如枚举> 2 ^ 31。只是简单的枚举。在32位或64位系统上,我的软件不会以16位运行!

2 个答案:

答案 0 :(得分:7)

如果enum始终为int,则以下内容将不安全:

enum oops {
    foo = 32767,
    bar, /*what am I?*/
};

这是因为int可以小到16位(这仍然是令人惊讶的常见)。在具有32位int的系统上,您可以设置foo = 2147483647,并且您的编译器肯定不会选择int作为基础类型。

因此,聪明的C ++标准指定底层enum整数类型必须能够表示给定的值,编译器可以自由选择一个合适的值。鉴于int通常被认为是机器的本机类型,它通常是明智的选择。

如果您想知道enum的基础类型,则std::underlying_type会提供此信息。

答案 1 :(得分:7)

让我们在任何现代编译器上看到它:

#include <iostream>
#include <limits>

enum MySmallSmall {
  SmallValue = 0,
};

enum MyLongLong {
  LongValue = std::numeric_limits<long long>::max()
};

int main() {
  std::cout << "sizeof MySmallSmall is " << sizeof(MySmallSmall) << std::endl;
  std::cout << "sizeof MyLongLong is " << sizeof(MyLongLong) << std::endl;
  return 0;
}

clang和g ++输出:

  

sizeof MySmallSmall是4

     

sizeof MyLongLong是8

但是对于MS Visual Studio,两个结果都是4(我已经使用这个网站http://rextester.com/l/cpp_online_compiler_visual检查了它,不知道这里有什么编译器版本)

所以你不能依赖任何枚举的sizeof。