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

时间:2011-11-13 23:13:44

标签: 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;
 }

输出:

  

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

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

8 个答案:

答案 0 :(得分:98)

  

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

然后你的面试官需要重温他对C ++标准如何运作的回忆。我引述:

  

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

整个“其基础类型未修复”部分来自C ++ 11,但其余部分都是标准C ++ 98/03。简而言之,sizeof(months_t) 4.它也不是2。 可以是其中任何一个。标准没有说它应该是多大的尺寸;只是它应该足够大以适应任何枚举器。

  

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

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

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

答案 1 :(得分:45)

大小为四个字节,因为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 **

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

答案 2 :(得分:9)

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

答案 3 :(得分:6)

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

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

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:4)

使用我现在老化的Borland C ++ Builder编译器枚举可以是1,2或4个字节,虽然它有一个标志,你可以翻转以强制它使用整数。

我猜这是特定于编译器的。

答案 6 :(得分:3)

我喜欢解释来自EdX(Microsoft:DEV210x C ++简介)的类似问题:

&#34;枚举将天的字面值表示为整数。参考数字类型表,您会看到一个int占用4个字节的内存。如果整个枚举被存储但是编译器只使用枚举的单个元素,则7天x 4个字节每个需要28个字节的内存,因此内存中的大小实际上是4个字节。&#34;

答案 7 :(得分:1)

枚举几乎是一个整数。简化很多

enum yourenum { a, b, c };

几乎就像

#define a 0
#define b 1
#define c 2

当然,事实并非如此。我试图解释枚举是某种编码......