C++中枚举类型数据的大小是多少?

use*_*288 62 c++ enums sizeof

这是一个C++面试测试题而不是作业.

#include <iostream>
using namespace std;
enum months_t { january, february, march, april, may, june, july, august, september,    
  october, november, december} y2k;

 int main ()
  {
    cout << "sizeof months_t is  " << sizeof(months_t) << endl;
    cout << "sizeof y2k is  " << sizeof(y2k) << endl;
    enum months_t1 { january, february, march, april, may, june, july, august,    
       september, october, november, december} y2k1;
    cout << "sizeof months_t1 is  " << sizeof(months_t1) << endl;
    cout << "sizeof y2k1 is  " << sizeof(y2k1) << endl;
 }
Run Code Online (Sandbox Code Playgroud)

输出:

sizeof months_t是4
sizeof
y2k是4
sizeof months_t1是4 sizeof y2k1是4

为什么所有这4个字节的大小?不是12 x 4 = 48字节?
我知道union元素占用相同的内存位置,但这是一个枚举.

Nic*_*las 106

这是一个C++面试测试题而不是作业.

然后你的面试官需要用C++标准的工作方式来重新回忆他的回忆.我引述:

对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.

整个"其基础类型不固定"部分来自C++ 11,但其余部分都是标准C++ 98/03.总之,sizeof(months_t) 4.它不是2任一.它可以是任何一个.标准没有说它应该是多大的尺寸; 只是它应该足够大以适应任何枚举器.

为什么所有大小都是4个字节?不是12 x 4 = 48字节?

因为枚举不是变量.枚举的成员不是实际变量; 它们只是#define的半类型安全形式.它们是以读者友好的格式存储数字的一种方式.编译器会将枚举器的所有用法转换为实际的数值.

调查员只是谈论一个数字的另一种方式.january只是简写0.0会占用多少空间?这取决于你存储的内容.

  • 这是一个不容忽视的优秀答案.虽然我的答案提供了理解枚举的基础知识,但如果你希望通过这种面试问题,你真的需要能够掌握这个级别的枚举. (10认同)

Obs*_*bot 50

大小是四个字节,因为enum它存储为int.只有12个值,您实际上只需要4位,但32位机器比小批量机器更有效地处理32位数量.

0 0 0 0  January
0 0 0 1  February
0 0 1 0  March
0 0 1 1  April
0 1 0 0  May
0 1 0 1  June
0 1 1 0  July
0 1 1 1  August
1 0 0 0  September
1 0 0 1  October
1 0 1 0  November
1 0 1 1  December
1 1 0 0  ** unused **
1 1 0 1  ** unused **
1 1 1 0  ** unused **
1 1 1 1  ** unused **
Run Code Online (Sandbox Code Playgroud)

如果没有枚举,您可能会想要使用原始整数来表示月份.这样可行并且效率很高,但这会使您的代码难以阅读.使用枚举,您可以获得高效的存储空间和可读性.

  • 原来的答案是对的.枚举必须至少为一个字节,但编译器可以自由使用更多内存.由于你可以在数组中使用枚举,`sizeof`必须是对齐的倍数.你不能将一个字节的枚举对齐到4个字节. (6认同)
  • Pre C++ 11依赖于sizeof(enum_value)是一个"非常糟糕的想法[TM]" (4认同)
  • 否 - 四位变量可以表示十六个不同值中的任何一个.您每个月不需要额外的四位.如果您想将月份存储为位向量,则只需要12位.这仍然可以安全地适应4个字节. (2认同)

cel*_*chk 9

这取决于.标准只要求它足够大以容纳所有值,因此正式的枚举就像enum foo { zero, one, two };只需要一个大字节一样.然而,大多数实现使这些枚举像int一样大(在现代硬件上更快;而且它与C的兼容性需要,其中枚举基本上是美化的内容).但请注意,C++允许枚举器的初始化程序在int范围之外,对于那些枚举,大小当然也会更大.例如,如果你有,enum bar { a, b = 1LL << 35 };那么即使在具有32位整数的系统上,你的枚举也将大于32位(最可能是64位)(请注意,在C中,不允许使用枚举).


age*_*tom 6

枚举有点像int类型的typedef(种类).

因此,您在其中定义的类型有12个可能的值,但是单个变量只有这些值中的一个.

可以这样想,当你定义一个枚举时,你基本上定义了另一种分配int值的方法.

在你提供的例子中,1月是另一种说0的方式,feb是另一种说法1等等,直到12月是另一种说法11.


小智 6

在 C++11 中你可以使用

enum myenum : uint8_t 
{
  ...
}
myenum myvar;
Run Code Online (Sandbox Code Playgroud)

并且您将得到 sizeof(myvar)==1 的保证...此功能被命名为“sized enum”,请参阅https://en.cppreference.com/w/cpp/language/enum(检查标记为的部分(自 C++11 起))


Stu*_*etz 5

因为它是该类型实例的大小 - 大概枚举值在这里存储为(32 位/4 字节)整数。