这是一个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字节?
我知道联合元素占用相同的内存位置,但这是一个枚举。
8条答案
按热度按时间xfb7svmp1#
这是一个C面试测试题,不是家庭作业。
然后你的面试官需要重新回忆一下C标准是如何工作的。我引用一下:
对于基础类型不固定的枚举,基础类型是整数类型,可以表示枚举中定义的所有枚举值。
整个“其底层类型不固定”部分来自C11,但其余部分都是标准的C98/03。简而言之,
sizeof(months_t)
是 * 而不是 * 4。它也不是2。它 * 可能 * 是这些中的任何一个。标准没有说明它应该是什么大小;只是它应该足够大以容纳任何调查员。为什么所有的大小是4字节?而不是12 x 4 = 48字节?
因为枚举不是变量。枚举的成员不是实际的变量;它们只是#define的半类型安全形式。它们是以读者友好的格式存储数字的一种方式。编译器会将枚举数的所有用法转换为实际的数值。
枚举器只是谈论数字的另一种方式。
january
只是0
的简写。0占用多少空间?这取决于你把它存储在什么地方。nhaq1z212#
在编译器中,大小为4字节,因为
enum
存储为int
。由于只有12个值,实际上只需要4位,但32位机器处理32位数量比处理更小数量更有效。如果没有枚举,你可能会尝试使用原始整数来表示月份。这是可行的,也是有效的,但是它会使你的代码难以阅读。使用枚举,你可以获得有效的存储和可读性。
其他编译器可以使用byte、int16、uint16 int或uint,只要变数可以包含枚举的所有值即可。
xoefb8l83#
这要看具体情况而定。标准只要求它足够大以容纳所有的值,所以形式上像
enum foo { zero, one, two };
这样的枚举只需要一个字节大。然而,大多数实现使这些枚举与int一样大(这在现代硬件上更快;此外,它还需要与C兼容,因为C中的枚举基本上是美化的int)。注意,C++允许枚举的初始化器在int范围之外,对于那些枚举,大小当然也会更大。例如,如果你有enum bar { a, b = 1LL << 35 };
,那么你的枚举将大于32位(很可能是64位),即使在一个有32位整数的系统上(注意在C中不允许枚举)。kqqjbcuj4#
枚举有点像int类型的typedef(类型)。
所以你在这里定义的类型有12个可能的值,但是一个变量只能有其中的一个值。
可以这样想,当你定义一个枚举时,你基本上是在定义另一种赋值int值的方法。
在你提供的例子中,January是表示0的另一种方式,Feb是表示1的另一种方式,等等,直到December是表示11的另一种方式。
ztyzrc3y5#
因为它是该类型示例的大小-假定枚举值在这里存储为(32位/ 4字节)int。
u5i3ibmn6#
对于我现在老化的Borland C++ Builder编译器,枚举可以是1、2或4字节,尽管它确实有一个标志,你可以翻转它来强制它使用int。
我想这是编译器特有的。
xqk2d5yq7#
我喜欢EdX(微软:DEV210x C++简介)的类似问题:
枚举将days得文本值表示为整数.参考数字类型表,您可以看到一个int占用4字节得内存.如果存储整个枚举,而编译器只使用枚举得单个元素,则7天x 4字节每个需要28字节得内存,因此内存中得大小实际上是4字节.
n6lpvg4x8#
枚举几乎是一个整数。
就像是
当然,这不是真的。我试图解释枚举是某种编码...