C의 원시 자료형에는 bool type이 없습니다. (C99이상에서 <stdbool.h> 라이브러리를 사용하여 _Bool
자료형을 사용할 수는 있으나)
따라서 C 코드에서 TRUE/FALSE를 판별하기 위해서는 보통 int
자료형을 쓰는 것이 일반적입니다 :
예를 들어, int is_checked
라는 flag를 세우거나, int is_upper(char c)
라는 판별함수를 작성하는 경우 등..
그런데 갑작스러운 의문이 들었던 점은
0 또는 1만 판별하면 되는 일에 왜 4byte나 잡아먹는 int
를 써왔던 것일까 하는 것입니다.
역사와 전통의 C라면 응당 메모리를 덜 쓰고자 하는 것이 자연스럽지 않을까요?
4byte보다는 1byte의 char
를 쓰면 어떨까요? 아니면, 아예 1bit 자료형을 선언할 수는 없는 것일까요?
먼저 앞서 생각했던, 1bit 자료형을 선언할 수 있을까요?
can I define a one bit variable?
여기에 저와 비슷한 생각을 한 사람이 있습니다.
등록된 답변으로부터, 결론부터 말하자면, 아래와 같이..
typedef struct foo
{
unsigned x:1;
} foo;
이렇게 쓰면, 우리는 컴파일러에게 "x는 1 bit만 쓸거야"라고 말할 수 있습니다.
그러나 이렇게 쓰는 경우처럼, 우리가 1 bit를 쓰기로 하든, 2 bit를 쓰기로 하든, foo
는 byte단위로 묶입니다. (structure packing arrangements)
따라서 우리는 1 bit만 쓰고 있지만 foo
는 unsigned int
만큼의 공간을 차지합니다.
또한, 자연스럽게도, foo
의 배열 또한 bit단위로 연속하지 않습니다.
<stdbool.h>
C99에서 boolean type의 _Bool
자료형을 포함하는 <stdbool.h>
라이브러리가 추가되었다고 앞서 언급했습니다.
그럼 _Bool
을 쓰면 되지 않을까요?
why use int instead of bool
_Bool
보다는 int
자료형을 사용하는 데에는 몇 가지 이유가 있을 수 있습니다.
int
를 써왔음_Bool
보다는 int
가 아직까지도 선호되는 편입니다.int
?그래서, 왜 하필 int
로 쓸까요?
위에서 1 bit자료형은 어차피 byte단위로 묶인다고 했으니, char
로 쓰면 더 절약적이지 않을까요?
Char or Int for boolean value in C?
여기에 저와 같은 질문을 한 사례가 있는데, 답변이 대략 이렇습니다 :
"int
가 보통 더 빠른 type이며, char
type으로 인한 메모리 절약은 무시할만한 수준이다 (negligible)"
여기서 int
is usually the fastest type이라고 한 것은, CPU가 word의 단위로 정보를 처리함과 관련이 깊습니다.
여기에 보면 이에 대한 논의가 있습니다.
글이 좀 긴데, 중요하다고 보이는 구문은 아래입니다.
Typically, CPUs are fastest at operating on integers of their native word size (with some caveats about 64-bit systems).
(주로 32-bit 아키텍처에 대해) word사이즈에 딱 맞는 int
형의 연산이 대체로 빠르다는 언급입니다.
좀 컴퓨터 아키텍처적인 부분이네요,
또한 이와 관련하여, C언어의 정수승격(promotion), 묵시적 형변환 등의 내용까지 자세히 다뤄야할 부분인 듯 합니다.
이 부분에 대해서는 나중에 포스팅을 따로 작성하도록 하고,
이정도에서 호기심 issue를 closed하도록 하겠습니다