这是一个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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof months_t是4
sizeof
y2k是4
sizeof months_t1是4 sizeof y2k1是4
为什么所有这4个字节的大小?不是12 x 4 = 48字节?
我知道union元素占用相同的内存位置,但这是一个枚举.
Nic*_*las 106
这是一个C++面试测试题而不是作业.
然后你的面试官需要用C++标准的工作方式来重新回忆他的回忆.我引述:
对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.
整个"其基础类型不固定"部分来自C++ 11,但其余部分都是标准C++ 98/03.总之,sizeof(months_t)是不 4.它不是2任一.它可以是任何一个.标准没有说它应该是多大的尺寸; 只是它应该足够大以适应任何枚举器.
为什么所有大小都是4个字节?不是12 x 4 = 48字节?
因为枚举不是变量.枚举的成员不是实际变量; 它们只是#define的半类型安全形式.它们是以读者友好的格式存储数字的一种方式.编译器会将枚举器的所有用法转换为实际的数值.
调查员只是谈论一个数字的另一种方式.january只是简写0.0会占用多少空间?这取决于你存储的内容.
Obs*_*bot 50
大小是四个字节,因为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 **
Run Code Online (Sandbox Code Playgroud)
如果没有枚举,您可能会想要使用原始整数来表示月份.这样可行并且效率很高,但这会使您的代码难以阅读.使用枚举,您可以获得高效的存储空间和可读性.
这取决于.标准只要求它足够大以容纳所有值,因此正式的枚举就像enum foo { zero, one, two };只需要一个大字节一样.然而,大多数实现使这些枚举像int一样大(在现代硬件上更快;而且它与C的兼容性需要,其中枚举基本上是美化的内容).但请注意,C++允许枚举器的初始化程序在int范围之外,对于那些枚举,大小当然也会更大.例如,如果你有,enum bar { a, b = 1LL << 35 };那么即使在具有32位整数的系统上,你的枚举也将大于32位(最可能是64位)(请注意,在C中,不允许使用枚举).
枚举有点像int类型的typedef(种类).
因此,您在其中定义的类型有12个可能的值,但是单个变量只有这些值中的一个.
可以这样想,当你定义一个枚举时,你基本上定义了另一种分配int值的方法.
在你提供的例子中,1月是另一种说0的方式,feb是另一种说法1等等,直到12月是另一种说法11.
小智 6
在 C++11 中你可以使用
enum myenum : uint8_t
{
...
}
myenum myvar;
Run Code Online (Sandbox Code Playgroud)
并且您将得到 sizeof(myvar)==1 的保证...此功能被命名为“sized enum”,请参阅https://en.cppreference.com/w/cpp/language/enum(检查标记为的部分(自 C++11 起))
| 归档时间: |
|
| 查看次数: |
104410 次 |
| 最近记录: |