[C++]Bit-Field와 union

dumdumer·2024년 9월 3일
0

C++

목록 보기
1/3

Bit-Field


Bit-Field는 변수들이 사용할 메모리 공간을 비트 단위로 지정해 구조체(클레스)의 멤버변수로 저장하는 방식이다. 다음과 같이 ( : )를 사용해 나타낼 수 있다.

struct S {
int b1 : 10; // 10비트를 사용
int b2 : 10; // b2의 범위는 [0, 1023]
int b3 : 8;  // [0, 255]
};
  • bit-field에 이름 없는 변수를 사용해 새로운 바이트에서 값을 시작하도록 할 수 있다.
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

특징

  1. bit-field 구조체의 크기는 사용한 정수 타입의 크기를 기준으로 잡힌다. (int로 구성된 bit-field 구조체는 4byte 단위로 크기가 잡힘.)

  2. bit-field에는 정수형 자료형만을 사용해야 한다.

  3. 멤버 변수에 할당하는 비트의 수는 자료형의 크기를 넘지 못한다. (char형 변수에 8bit를 초과하는 크기를 할당하면 컴파일 에러 발생.)


Union


공용체(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 출력하는 오류가 발생.
  1. 위 예시처럼 A의 멤버 변수 x에 1023을 할당했다면, union의 크기 4byte(32bit) 중에서 4byte를 사용하여 1023을 할당한다.
  2. 1023은 이진법으로 1111111111이다.
  3. 여기서 멤버변수 y를 0(1byte)으로 할당하게 되면 x에 값을 할당해 놓은 공간이 y를 위한 값 할당으로 덮이게 되는 것이다.
  4. x는 1100000000이 된다.
  5. 결과적으로 x값은 768로 바뀌게 되는 상황이 발생한다.

특징

  1. union의 크기는 멤버 변수의 타입 중 가장 큰 타입의 크기로 정해진다.

  2. 아래 예시처럼 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)

https://en.cppreference.com/w/cpp/language/bit_field

profile
tik tok

0개의 댓글