본문 바로가기
프로그래밍/C

[C언어] bool 타입에 대한 흥미로운 이야기

by 알용 2012. 11. 19.
반응형

얼마 전, C++ 프로그래밍을 하던 도중 bool이 아닌 BOOL 타입에 관한 의문점이 생겼습니다.

bool 이라는 이름의 타입이 이미 존재하는데 어째서 windows.h 헤더파일에서 BOOL 타입을 정의해놓았을까.

아무 생각없이 int, char, float, double, __int64 까지 sizeof 연산자 이용해서 자료형 크기 출력하다가

BOOL 타입도 해보았습니다.

 

printf("%d", sizeof(BOOL));

 

위 명령문을 실행하면 결과값이 어떻게 될까요?

 

bool 타입에 대해 어느정도 알고 계신 분이라면 1 이라고 생각하셨겠죠?

정답은 4 입니다.

 

전 당연히 windows.h 헤더에 #define BOOL bool 또는 typedef bool BOOL; 로 정의되어 있을 것이라 생각했었습니다.

 

windows.h 헤더를 열어보니 windef.h 헤더가 선언되어 있었습니다.

 

typedef int                 BOOL;

 

BOOL 타입은 int 자료형으로 지정되어 있었습니다.

 

Google 검색엔진을 통해 검색을 해보았다가 흥미로운 포스트를 읽게 되었습니다. 

(좌표는 이 곳: http://blog.daum.net/rectork/39 )

 

bool 타입이 비교 연산을 하는 과정에 있어서 int 자료형보다 2byte 가 더 사용된다고 합니다.

bool 타입의 크기는 1이고, int 타입의 크기는 4입니다.

 

변수의 크기만을 고려해 보았을 때 무려 4배나 적은 bool 타입이 효율적일 것 같지만

이것은 어디까지나 용량만을 고려했을 때의 이야기이고 처리 속도까지 생각하면 정반대라는 결과가 나옵니다.

 

포스트를 보면 int 와 0 을 비교할 때 cmp 명령어 하나,

bool 과 false 를 비교할 때 movzx, test 두개를 사용한다는군요.

 

비교한다는 점에서 동일하지만 어셈블리를 모르는 제가 봐도 명령어 두개를 사용하는 것보다는

명령어 한개를 사용하는 것이 소모하는 크기를 봤을 때도, 처리 속도를 봤을 때도 효율적이라는 것을 알 수 있습니다.

 

MSDN 에 제가 직접 문의한 것은 아니지만 위 내용을 바탕으로 추측해보건데,

과거에 메모리가 극히 부족하던 시절에나 bool 타입을 자주 쓰고

현대에 와서는 발코딩만 하지 않는다면  메모리가 부족할 일이 거의 없는 것 같거든요.

 

메모리는 그럭저럭 여유롭게 쓸 수 있으니 처리 속도를 더 중하게 생각한 개발자가

고의로 저렇게 int 타입을 BOOL 타입으로 둔갑시키지 않았을까 싶네요.

 

Pawno 에서는 잘 모르겠네요.

new 라는 자료형으로 정수형과 문자형을 다 사용하니 비교 연산을 할 때

정수나 문자로 변형하는 어셈블리 명령어가 추가될 것 같거든요.

그래서 Pawno 에서는 bool 형이 더 효율적인지, new 타입이 더 효율적인지 알 수가 없네요.

 

결론이 Pawno 에서는 알 수 없다 라서 긴 글 읽은 SA:MP 모드메이커 분들한테는 실망감이 들 수도 있겠네요.

다만, Pawno 에서 그치치 않고 C/C++ 을 나중에 학습하실 계획이 있으신 분이라면

알고 있어도 나쁘지 않은 지식 같습니다.

 

긴 글 읽어주셔서 감사합니다. 

 

 

 

반응형

'프로그래밍 > C' 카테고리의 다른 글

[C언어] 콘솔 텍스트 색깔 변경  (1) 2022.02.10
[C언어] 아스키(ASCII) 코드 출력  (0) 2022.02.10
XOR 연산자의 활용  (0) 2012.11.19
[C언어] 제어 문자란?  (1) 2012.06.06
[C언어] 주석(Comment)  (0) 2012.06.01