다음을 통해 공유


C++ 비트 필드

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

구문

declarator : constant-expression

설명

(선택 사항) 선언자는 프로그램에서 멤버에 액세스하는 데 사용되는 이름입니다. 정수 형식(열거형 형식 포함)이어야 합니다. constant-expression은 구조체에서 멤버가 차지하는 비트 수를 지정합니다. 익명 비트 필드(식별자가 없는 비트 필드 멤버)를 안쪽 여백에 사용할 수 있습니다.

참고 항목

너비가 0인 명명되지 않은 비트 필드는 다음 비트 필드를 다음 type 경계에 강제로 맞춥니다. 여기서 type은 멤버의 형식입니다.

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

// 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 형식 개체의 개념적 메모리 레이아웃을 보여 줍니다.

n WeekDay, n MonthDay, n Month 및 n Year 비트 필드가 있는 위치를 보여 주는 날짜 개체의 메모리 레이아웃 다이어그램.

32비트의 메모리가 연속으로 표시됩니다. 최하위 비트부터 시작하여 3비트는 nWeekDay에 대한 것입니다. 다음 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)
};

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

맞춤 패딩을 강제하는 길이가 0인 비트 필드가 있는 Date 개체의 레이아웃 다이어그램.

64비트의 메모리가 연속으로 표시됩니다. 최하위 비트부터 시작하여 5비트는 n Month를 의미합니다. 다음 8비트는 n Year를 나타냅니다. 다음 19비트는 사용되지 않습니다. 다음 3비트는 n WeekDay에 대한 것입니다. 다음 6비트는 n MonthDay에 대한 것입니다. 나머지 비트는 사용되지 않습니다.

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

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

비트 필드에 대한 제한

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

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

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

참고 항목

클래스 및 구조체