C++ 비트 필드

클래스와 구조체는 정수 형식보다 작은 스토리지 공간을 차지하는 멤버를 포함할 수 있습니다. 이러한 멤버는 비트 필드로 지정됩니다. 비트 필드 멤버 선언자 사양의 구문은 다음과 같습니다.

구문

declarator:constant-expression

설명

(선택 사항) 선언자는 프로그램에서 멤버에 액세스하는 이름입니다. 정수 형식(열거형 형식 포함)이어야 합니다. 상수 식멤버가 구조체에서 차지하는 비트 수를 지정합니다. 익명 비트 필드, 즉 식별자가 없는 비트 필드 멤버를 패딩에 사용할 수 있습니다.

참고 항목

너비가 0인 명명되지 않은 비트 필드는 다음 비트 필드의 맞춤을 다음 형식 경계로 강제 정렬합니다. 여기서 형식 은 멤버의 형식입니다.

다음 예제에서는 비트 필드가 포함된 구조체를 선언합니다.

// bit_fields1.cpp
// compile with: /LD
struct Date {
   unsigned short nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned short nMonthDay : 6;    // 0..31  (6 bits)
   unsigned short nMonth    : 5;    // 0..12  (5 bits)
   unsigned short nYear     : 8;    // 0..100 (8 bits)
};

형식 Date 개체의 개념적 메모리 레이아웃은 다음 그림에 나와 있습니다.

Diagram of the memory layout of a date object, showing where the n WeekDay, n MonthDay, n Month, and n Year bit fields are located.

32비트 메모리가 행에 표시됩니다. 가장 중요한 비트부터 nWeekDay의 경우 3비트입니다. 다음 6비트가 nMonthDay용입니다. 다음 5비트가 nMonth용입니다. 다음 2비트가 사용되지 않습니다. 다음 8비트에서는 nYear입니다. 다시 기본 8비트가 사용되지 않습니다.

nYear 는 8비트 길이로 선언된 형식 unsigned short의 단어 경계를 오버플로합니다. 따라서 새 unsigned short시작 부분에서 시작됩니다. 모든 비트 필드가 기본 형식의 한 개체에 맞는 것은 아닙니다. 선언에서 요청된 비트 수에 따라 새 스토리지 단위가 할당됩니다.

Microsoft 전용

비트 필드로 선언된 데이터의 순서는 이전 그림과 같이 낮음에서 높음으로 정렬됩니다.

Microsoft 전용 종료

다음 예제와 같이 구조체 선언에 길이가 0인 명명되지 않은 필드가 포함된 경우:

// bit_fields2.cpp
// compile with: /LD
struct Date {
   unsigned nWeekDay  : 3;    // 0..7   (3 bits)
   unsigned nMonthDay : 6;    // 0..31  (6 bits)
   unsigned           : 0;    // Force alignment to next boundary.
   unsigned nMonth    : 5;    // 0..12  (5 bits)
   unsigned nYear     : 8;    // 0..100 (8 bits)
};

그런 다음 메모리 레이아웃은 다음 그림과 같습니다.

Diagram of the layout of a Date object, with a zero length bit field, which forces alignment padding.

64비트 메모리가 행에 표시됩니다. 최소 중요 비트부터 5비트(n개월)입니다. 다음 8비트에서는 n년입니다. 다음 19비트가 사용되지 않습니다. 다음 3비트가 n WeekDay용입니다. 다음 6비트가 n MonthDay용입니다. 다시 기본 비트는 사용되지 않습니다.

기본 제공 형식에 설명 된 대로 비트 필드의 기본 형식은 정수 형식이어야 합니다.

형식 참조에 대한 이니셜라이저가 형식 const T& 의 비트 필드를 T참조하는 lvalue이면 참조가 비트 필드에 직접 바인딩되지 않습니다. 대신 참조는 비트 필드의 값을 보유하도록 초기화된 임시에 바인딩됩니다.

비트 필드에 대한 제한

비트 필드에 대한 잘못된 연산은 다음과 같습니다.

  • 비트 필드의 주소 가져오기

  • 비트 필드를 사용하여 비 참조const 를 초기화합니다.

참고 항목

클래스 및 구조체