这是一个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元素占用相同的内存位置,但这是一个枚举。
答案 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
当然,事实并非如此。我试图解释枚举是某种编码......