윈도우프로그래밍2012. 4. 9. 12:04

어느날 문득 소스코드를 보다보니 어떤 것은 BOOL을 사용하여 TRUE와 FALSE를 사용한 것이 있는가 반면

어떤 소스는 bool을 사용하여 true와 false를 값으로 사용하는 것들을 보았다...

몇 번을 겪다보니 왜 이 두 가지 데이터형이 존재하는가?에 대하여 의문이 들기 시작했다.


우선 BOOL은 MFC에서 int를 재정의한 키워드이다. 

C는 함수의 성공과 실패의 값을 0과 -1을 리턴하지만 boolean이라는 자료형을 제공하지 않았다.
이를 사용하던 WIN32 API는 자체적으로 BOOL키워드를 만들어 제공하였으며 원형을 찾아보면 

typedef int    BOOL와 같이 정의되어있다. 즉 int형의 재정의이다.

또한 이것에 사용되는 TRUE와 FALSE 키워드의 경우도 #define FALSE   0 #define TRUE    1로 정의 되어있다.


1995년에 자바가 공식 발표 후에 C++에 bool이라는 데이터 형이 추가되었다고 한다.

이후 MFC에도 bool자료형을 사용할 수 있게 되었다. 


의문이 들었다..."비슷하다고 마음대로 쓸수있는가?" 이다. 

우선 용량을 비교하면 bool의 승리이다.

BOOL은 int형으로 4바이트의 크기를 갖는다.

bool은 단지 1바이트의 값을 갖는다.


단지 참과 거짓을 비교하기 위해 4바이트를 사용할 필요는 없다.

sizeof()를 사용하여 여기까지 검증해 보았다면 bool형을 사용할 것 같다.


또한 int의 값을 사용하는 BOOL은 제대로 초기화 하지 않으면 참과 거짓의 값을 비교하는데 신뢰가 떨어진다.

그리고 TRUE가 true를 의미하지 않을 수 있다.

void myFunc()

{

BOOL isSuccess = connectFunc();//실패:0, 성공:0이 아닌 다른 값

if( isSuccess == TRUE ){

A Routine;

}else if( isSuccess == FALSE ){

B Routine;

}

}

물론 명시적으로  isSuccess != 0이 아닌 isSuccess == TRUE 으로 두어 문제를 만들어낸 코드이지만,

반드시 1이 아닌 다른 값이 넘어올 수 있다는 것을 증명하는 것이 중요하다. 

C Main같은 경우 0과 -1을 리턴하므로 그러한 값을 바로 리턴한다면 연결 성공 후 A Routine이 실행하지 않을 수 있다.


이런 저런 상황으로 보면 bool을 사용해야 맞는가? 그것도 확실하지 않다.

자료를 찾던 중 어셈블러의 연산에 대하여 접하게 되었다.


bool은 어셈블리 연산에서 사용되는 연산 바이트 코드수가 더 많아진다고 한다. 

32비트 컴퓨터에서 int를 0과 비교하는데는 cmp명령어 하나로 4바이트가 소모되는 반면

bool의 treu/false를 비교하기 위해서는 movxz, cmp명령어를 사용해야하므로 7바이트가 소모되어 BOOL보다 3바이트를 더 소비한다.


* bool 을 true 와 비교

004113B7 0F B6 45 F8        movzx      eax,byte ptr [bool Object] 

004113BB 83 F8 01             cmp         eax,1 

004113BE 75 07                   jne           wmain+47h (4113C7h) 


* BOOL 을 TRUE 와 비교

004113C7 83 7D E0 01        cmp         dword ptr [BOOL Object],1 

004113CB 75 07                   jne           wmain+54h (4113D4h) 



결론은 bool과 BOOL의 호불호가 갈리는 시점에서 난 BOOL을 사용해야하지 않나 싶다.

bool이 미약하지만 용량을 줄여주는 반면 데이터를 옮겨 저장해두고 비교하기 위한 루틴 때문에 비효율적이다에 한 표를 던져 본다.










Posted by 버터백통