bool 대신에 uint8 <변수명>:1을 쓰는 이유

전지훈·2021년 10월 19일
0

CPP

목록 보기
1/1
post-thumbnail

CPP 프로그래밍을 하다보면 종종 아래와 같은 코드를 보게 된다. 변수명만 보아도 이것은 코딩스탠다드도 bool 변수와 동일하고 실제 사용법도 bool 변수와 사실상 동일하게 사용된다.

uint8 bBlockInput:1;
uint8 bCollideWhenPlacing:1;
uint8 bFindCameraComponentWhenViewTarget:1;
uint8 bGenerateOverlapEventsDuringLevelStreaming:1;
uint8 bIgnoresOriginShifting:1;
uint8 bEnableAutoLODGeneration:1;
uint8 bIsEditorOnlyActor:1;
uint8 bActorSeamlessTraveled:1;

하지만 이것은 명백히 bool 변수는 아니다. 이건 비트필드(bit field)가 선언된 것이다. 비트필드는 아래와 같은 구문으로 작성된다.

정수형식(열거형 형식 포함) 변수명 : 차지하는 비트수

비트필드로 선언된 변수는 정수형식(uint8, uint16, ...)이 차지하는 공간을 연속하는 비트필드가 공유하여 사용할 수 있다. 즉 위에 적혀있는 8개의 비트필드는 uint8의 메모리 영역(1byte = 8bit) 내부의 각 1bit 씩 배치된다. (자세한 내용은 MSDN의 bit field 참고)

이를 통해 각각을 bool 변수로 선언했을 경우 1byte(8bit) * 8 = 8byte(64bit)의 메모리 공간이 필요하지만, 비트필드를 활용하면 1byte(8bit) 공간안에 8개의 bool 변수를 담을 수 있게된다.

얼추보면 메모리 사용 영역을 크게 줄여주니 bool 변수보다 장점만 있는 것 처럼 보이지만 꼭 그런건아니다.

비트필드는 선언과 동시에 값을 초기화 해주는 것이 불가능하며 비트필드의 주소를 가져오거나, non-const 참조 변수를 비트필드로 초기화 하는 것은 불가능하니 유의해야한다.

열거형(enum)의 경우 내부에 선언된 멤버의 개수에 따라 비트수를 달리 해주어야한다. 예를 들면 ~2개는 1, ~4개는 2, ~8개는 3 이런식이다.

보통 비트필드는 일반적인 상황에서는 코드의 가독성이나 편의성이 떨어져 굳이 사용할 필요는 없지만 클래스나 구조체가 네트워크나 최적화와 엮이게 된다면 사용을 고려해야한다.

참고자료

https://docs.microsoft.com/ko-kr/cpp/cpp/cpp-bit-fields?view=msvc-160

profile
10%의 확신과 90%의 어.. 이게 왜 되지?

0개의 댓글