다음을 통해 공유


C++ 비트 필드

클래스와 구조체는 정수 계열 형식보다 적은 저장소를 차지하는 멤버를 포함할 수 있습니다. 이 멤버는 비트 필드로 지정됩니다. 비트 필드 멤버 선언자 사양에 대한 구문은 다음과 같습니다.

declarator  : constant-expression

설명

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

참고

너비가 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 형식 개체의 개체에 대한 개념적 메모리 레이아웃은 다음 그림과 같습니다.

날짜 개체의 메모리 레이아웃

날짜 개체의 메모리 레이아웃

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인 비트 필드가 있는 날짜 개체의 레이아웃

길이가 0인 비트 필드가 있는 날짜 개체의 레이아웃

비트 필드의 근본 유형은 기초 유형에서 설명하고 있는 것처럼, 완전한 유형이어야 합니다.

참고 항목

참조

클래스, 구조체 및 공용 구조체