Bit-Field는 변수들이 사용할 메모리 공간을 비트 단위로 지정해 구조체(클레스)의 멤버변수로 저장하는 방식이다. 다음과 같이 ( : )를 사용해 나타낼 수 있다.
struct S {
int b1 : 10; // 10비트를 사용
int b2 : 10; // b2의 범위는 [0, 1023]
int b3 : 8; // [0, 255]
};
struct S {
// 3 bits: b1에 할당
// 5 bits: 사용되지 않음(다음 byte로 넘어감)
// 2 bits: b2에 할당(새로운 byte)
// 6 bits: 사용되지 않음
unsigned char b1 : 3;
unsigned char :0; // start a new byte
unsigned char b2 : 2;
}; // sizeof(S) == 2
특징
bit-field 구조체의 크기는 사용한 정수 타입의 크기를 기준으로 잡힌다. (int
로 구성된 bit-field 구조체는 4byte 단위로 크기가 잡힘.)
bit-field에는 정수형 자료형만을 사용해야 한다.
멤버 변수에 할당하는 비트의 수는 자료형의 크기를 넘지 못한다. (char
형 변수에 8bit를 초과하는 크기를 할당하면 컴파일 에러 발생.)
공용체(Union)는 서로 다른 자료형들이 하나의 메모리 공간을 공유하도록 하는 키워드이다.
union A
{
int x;
char y;
}; // sizeof(A) : 4
자료형들이 하나의 메모리 공간을 공유하기 때문에 멤버 변수들을 잘못 사용하면 예상치 못한 오류가 발생할 수 있다.
다음 예시를 보자.
union A
{
int x;
char y;
}; // sizeof(A) : 4
A a;
a.x = 1023; // 32bit에서 00...001111111111
a.y = 0; // 1byte(8bit) 값을 0으로 바꿈
// => 00...001100000000
cout << a.x; // 2^9 + 2^8 = 768 출력하는 오류가 발생.
A
의 멤버 변수 x
에 1023을 할당했다면, union의 크기 4byte(32bit) 중에서 4byte를 사용하여 1023을 할당한다.y
를 0(1byte)으로 할당하게 되면 x
에 값을 할당해 놓은 공간이 y
를 위한 값 할당으로 덮이게 되는 것이다.x
는 1100000000이 된다.x
값은 768로 바뀌게 되는 상황이 발생한다.특징
union
의 크기는 멤버 변수의 타입 중 가장 큰 타입의 크기로 정해진다.
아래 예시처럼 union
은 이름 없이 정의하는 것이 가능하다.
"익명 공용체"(Anonymous union)라고 하며, 전역or네임스페이스 범위에서 사용하려면 static
을 사용해야 한다.
static A{
char a;
char b;
};
struct S {
union {
int x;
int y;
};
};
S s;
s.x = 100;
.
.
.
C++을 공부를 위해 작성한 글입니다. 오류가 있다면 지적해주시면 감사겠습니다.
참고자료
https://github.com/federico-busato/Modern-CPP-Programming (04.Basic_Concepts_III)