C ++에서 열거 형 데이터의 크기는 얼마입니까?
이것은 숙제가 아닌 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
크기 y2k는 4
sizeof months_t1은 4
크기 y2k1은 4
이 4 바이트의 크기는 왜입니까? 12 x 4 = 48 바이트가 아닙니까?
유니온 요소가 동일한 메모리 위치를 차지한다는 것을 알고 있지만 이것은 열거 형입니다.
이 파일로 enum
저장 되기 때문에 크기는 4 바이트 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 ++ 인터뷰 시험 문제입니다.
그런 다음 면접관은 C ++ 표준이 작동하는 방식으로 자신의 기억을 새롭게해야합니다. 그리고 나는 인용한다 :
기본 형식이 고정되지 않은 열거 형의 경우 기본 형식은 열거 형에 정의 된 모든 열거 자 값을 나타낼 수있는 정수 형식입니다.
"기본 유형이 고정되지 않은"부분 전체는 C ++ 11에서 가져온 것이지만 나머지는 모두 표준 C ++ 98 / 03입니다. 즉,이 sizeof(months_t)
입니다 하지 4. 그것은 둘 중 하나가 아닙니다. 그것들 중 하나 일 수 있습니다. 표준은 그것이 어떤 크기 여야 하는지를 말하지 않습니다. 열거 자에 맞도록 충분히 커야합니다.
모든 크기가 4 바이트 인 이유는 무엇입니까? 12 x 4 = 48 바이트가 아닙니까?
열거 형은 변수가 아니기 때문입니다. 열거 형의 멤버는 실제 변수가 아닙니다. #define의 반 유형 안전 형식 일뿐입니다. 독자에게 친숙한 형식으로 숫자를 저장하는 방법입니다. 컴파일러는 열거 자의 모든 사용을 실제 숫자 값으로 변환합니다.
열거자는 숫자에 대해 말하는 또 다른 방법입니다. january
의 약어입니다 0
. 그리고 0은 얼마나 많은 공간을 차지합니까? 그것은 당신이 그것을 저장하는 것에 달려 있습니다.
It depends. The standard only demands that it is large enough to hold all values, so formally an enum like enum foo { zero, one, two };
needs to only be one byte large. However most implementations make those enums as large as ints (that's faster on modern hardware; moreover it's needed for compatibility with C where enums are basically glorified ints). Note however that C++ allows enums with initializers outside of the int range, and for those enums the size will of course also be larger. For example, if you have enum bar { a, b = 1LL << 35 };
then your enum will be larger than 32 bits (most likely 64 bits) even on a system with 32 bit ints (note that in C that enum would not be allowed).
An enum is kind of like a typedef for the int type (kind of).
So the type you've defined there has 12 possible values, however a single variable only ever has one of those values.
Think of it this way, when you define an enum you're basically defining another way to assign an int value.
In the example you've provided, january is another way of saying 0, feb is another way of saying 1, etc until december is another way of saying 11.
Because it's the size of an instance of the type - presumably enum values are stored as (32-bit / 4-byte) ints here.
With my now ageing Borland C++ Builder compiler enums can be 1,2 or 4 bytes, although it does have a flag you can flip to force it to use ints.
I guess it's compiler specific.
I like the explanation From EdX (Microsoft: DEV210x Introduction to C++) for a similar problem:
"The enum represents the literal values of days as integers. Referring to the numeric types table, you see that an int takes 4 bytes of memory. 7 days x 4 bytes each would require 28 bytes of memory if the entire enum were stored but the compiler only uses a single element of the enum, therefore the size in memory is actually 4 bytes."
An enum is nearly an integer. To simplify a lot
enum yourenum { a, b, c };
is almost like
#define a 0
#define b 1
#define c 2
Of course, it is not really true. I'm trying to explain that enum are some kind of coding...
참고URL : https://stackoverflow.com/questions/8115550/what-is-the-size-of-an-enum-type-data-in-c
'development' 카테고리의 다른 글
값 C #을 가장 가까운 정수로 반올림하는 방법은 무엇입니까? (0) | 2020.12.06 |
---|---|
C에서 main에 대한 인수 (0) | 2020.12.06 |
별 5 개 등급을 계산하는 데 사용되는 알고리즘 (0) | 2020.12.06 |
선택적 문자열 확장을 추가하는 방법은 무엇입니까? (0) | 2020.12.06 |
RecyclerView의 ItemAnimator를 구현하여 notifyItemChanged 애니메이션을 비활성화하는 방법 (0) | 2020.12.06 |