C ++中枚举types数据的大小是多less?

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

#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
y2k的大小是4
sizeof months_t1是4
sizeof y2k1是4

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

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

没有枚举,你可能会试图用生整数来表示月份。 这将工作和高效率,但它会使你的代码难以阅读。 通过枚举,您可以获得高效的存储和可读性。

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

然后,面试官需要重新回顾一下C ++标准的工作原理。 我引用:

对于底层types不固定的枚举,底层types是一个整型,可以表示枚举中定义的所有枚举值。

整个“其底层types不固定”部分来自C ++ 11,其余全部是标准的C ++ 98/03。 总之, sizeof(months_t) 不是 4.也不是2。 它可以是任何这些。 标准没有说明应该是多less; 只有它应该足够大以适应任何调查员。

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

因为枚举不是variables。 枚举的成员不是实际variables; 它们只是#define的半安全forms。 这是一种以读者友好的格式存储数字的方式。 编译器将把枚举器的所有用途转换为实际的数值。

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

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

枚举有点像inttypes的typedef(类)。

所以你定义的types有12个可能的值,但是一个variables只能有一个值。

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

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

因为这是一个types实例的大小 – 大概枚举值在这里存储为(32位/ 4字节)整数。

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

我想这是编译器的具体。

我喜欢从EdX(微软:DEV210x简介C ++)的解释类似的问题:

“枚举表示天数的字面值作为整数,参考数字types表,你会看到一个int需要4个字节的内存,如果整个枚举被存储,7天x 4字节每个需要28个字节的内存,但是编译器只使用枚举的单个元素,因此内存中的大小实际上是4个字节。

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

 enum yourenum { a, b, c }; 

几乎像

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

当然,这不是真的。 我试图解释,枚举是一种编码…