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

pxy2qtax  于 2022-11-27  发布在  其他
关注(0)|答案(8)|浏览(1322)

这是一个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;
 }

输出量:
月_t的大小为4
y2k的大小是4
月_t1的大小为4
y2k1的大小是4
为什么这4个字节的大小都是12 x 4 = 48字节?
我知道联合元素占用相同的内存位置,但这是一个枚举。

xfb7svmp

xfb7svmp1#

这是一个C面试测试题,不是家庭作业。
然后你的面试官需要重新回忆一下C
标准是如何工作的。我引用一下:
对于基础类型不固定的枚举,基础类型是整数类型,可以表示枚举中定义的所有枚举值。
整个“其底层类型不固定”部分来自C11,但其余部分都是标准的C98/03。简而言之,sizeof(months_t)是 * 而不是 * 4。它也不是2。它 * 可能 * 是这些中的任何一个。标准没有说明它应该是什么大小;只是它应该足够大以容纳任何调查员。
为什么所有的大小是4字节?而不是12 x 4 = 48字节?
因为枚举不是变量。枚举的成员不是实际的变量;它们只是#define的半类型安全形式。它们是以读者友好的格式存储数字的一种方式。编译器会将枚举数的所有用法转换为实际的数值。
枚举器只是谈论数字的另一种方式。january只是0的简写。0占用多少空间?这取决于你把它存储在什么地方。

nhaq1z21

nhaq1z212#

在编译器中,大小为4字节,因为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 **

如果没有枚举,你可能会尝试使用原始整数来表示月份。这是可行的,也是有效的,但是它会使你的代码难以阅读。使用枚举,你可以获得有效的存储和可读性。
其他编译器可以使用byte、int16、uint16 int或uint,只要变数可以包含枚举的所有值即可。

xoefb8l8

xoefb8l83#

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

kqqjbcuj

kqqjbcuj4#

枚举有点像int类型的typedef(类型)。
所以你在这里定义的类型有12个可能的值,但是一个变量只能有其中的一个值。
可以这样想,当你定义一个枚举时,你基本上是在定义另一种赋值int值的方法。
在你提供的例子中,January是表示0的另一种方式,Feb是表示1的另一种方式,等等,直到December是表示11的另一种方式。

ztyzrc3y

ztyzrc3y5#

因为它是该类型示例的大小-假定枚举值在这里存储为(32位/ 4字节)int。

u5i3ibmn

u5i3ibmn6#

对于我现在老化的Borland C++ Builder编译器,枚举可以是1、2或4字节,尽管它确实有一个标志,你可以翻转它来强制它使用int。
我想这是编译器特有的。

xqk2d5yq

xqk2d5yq7#

我喜欢EdX(微软:DEV210x C++简介)的类似问题:
枚举将days得文本值表示为整数.参考数字类型表,您可以看到一个int占用4字节得内存.如果存储整个枚举,而编译器只使用枚举得单个元素,则7天x 4字节每个需要28字节得内存,因此内存中得大小实际上是4字节.

n6lpvg4x

n6lpvg4x8#

枚举几乎是一个整数。

enum yourenum { a, b, c };

就像是

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

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

相关问题