Util.hpp에 대해서 대충 설명을 하고 넘겼다.


 어떻게 동작하고 되는지 설명을 작성할려고한다.


 

1
2
3
4
5
#ifdef WIN32
#define forceinline __forceinline
#else
#define forceinline inline __attribute__((always_inline))
#endif
cs

 처음에 이렇게 되어 있는게 있다.

 WIN32이란, 컴파일러에 정의되어있는 매크로이다.
 이것은 Win32에 컴파일을 하기 위해서 사용하는 것이다.(Windows OS에서 컴파일을 하지 않을 경우란, 리눅스에서 사용할 경우가 해석이 될 수 있다.)

 __forceinline이라는 것이 있다. 이것은 인라인 함수이다.[각주:1]


 설명을 본다면, 함수의 속도를 높이기 위해서 사용을 한다.[각주:2][각주:3]


 일반적인 함수는 사용할때마다 호출하므로 제어권의 이동이 심해서 실행 속도가 느려진다고 한다. 그리고 데이터형 체크를 할 수 있어서, 오버헤드를 줄인다고 하낟.


 단점은 실행 파일이 커진다고 한다.


 더 자세한 것은 참조 블로그를 읽으면서 확인하길 바란다.


 그래서 Win32(윈도우 운영체제일 경우)에 인라인 함수 매크로로 정의를 시킨다.(다음 소스에서 자주 사용이 된다.)


1
2
3
4
5
6
7
forceinline static bool isUpperCase(int c){
 return c>='A'&&c<='Z';
}
 
forceinline static bool isLowerCase(int c){
 return c>='a'&&c<='z';
}
cs

 isUpperCase랑 isLowerCase는 해당 영문을 받아들여서 대문자인지 소문자인지 알아보는 소스이다.
 여기서 알아야 될 것은 ASCII이다.
 컴퓨터는 모든 데이터를 숫자로 알고 있다.
 그래서 ASCII에서 내용 또한 숫자가 될 수 있고, 문자가 될 수 있다.(출력할때, 문자인지 아닌지 확인해서 처리하는 방식으로 우리가 문자를 출력해준다.)

 그래서 ASCII의 표를 읽어본다면, 대문자의 범위와 소문자의 범위가 있고, 그것을 참과 거짓으로 출력하는 함수이다.

1
2
3
forceinline static bool isWordChar(int c){
 return isLowerCase(c)||isUpperCase(c)||c>=128;
}
cs


 isWordChar 또한, ASCII을 분석하면 나오는 것이다.

 여기서 ASCII는 최대 128가지의 문자만 정의되어 있고, 그 이상은 ASCII에 정의되지 않은 숫자 데이터이다.(이걸 이용해서 UNICODE등을 사용할때, 128초과되는 수를 앞에 사용한다.)


 그래서, 이걸 이용해서 문자인지 아닌지 확인을 한다.(단, 영문이라는 보장은 없다.)


1
2
3
4
5
6
7
8
9
forceinline static int makeLowerCase(int c){
 assert(isUpperCase(c));
 return c-'A'+'a';
}
 
forceinline static int makeUpperCase(int c){
 assert(isLowerCase(c));
 return c-'a'+'A';
}
cs

 makeLowerCase와 makeUpperCase는 대문자를 소문자로, 소문자를 대문자로 만드는 함수이다.

 여기서 assert는 사용자에게 작동을 하다가 오류가 발생하면, 알려주는 작업을 하는 매크로 함수이다.

 #include<cassert> 라는 헤더(assert.h와 동일한 헤더이다.)에서 정의되어 있는 함수이다.

 0을 준다면, 문제가 발생. 0이외의 값을 준다면, 문제가 없음.으로 처리한다.
 이것은 release 모드(실행 파일 생성)일때, 컴파일을 멈춰준다. 그래서 개발자가 어디에서 오류가 났는지 알 수 있게 도움을 줄 수 있다.

 c-'A'+'a'; 라는 것은 일단, 컴퓨터는 모든 데이터가 숫자라고 했다. 'A' 또한, ASCII에서 'A'을 정의된 숫자이다. 그래서 c-'A'처럼 계산이 가능하게 된다.

 c가 'D'라고 가정하자.(여기서 c가 소문자일 경우엔, assert 함수에 의해서 오류가 발생하게 된다.)
 'A'와 'D'의 거리는 4만큼 차이가 나게 된다. 여기서 'a'을 더하게 되면, 'a'의 기준으로 4만큼 간 값이 되기 때문에 'd'가 나오게 된다.

 makeUpperCase 또한 동일한 방식으로 계산이 되는 것이다.

 만약에 c가 대/소문자에 들어가 있지 않다면, assert에 의해서 오류가 발생하게 된다.

 일부는 나중에 더 적는걸로...


  1. 참조 : https://msdn.microsoft.com/ko-kr/library/bw1hbe6y.aspx(2016-07-19) [본문으로]
  2. 인라인 함수 특징과 장단점을 설명하는 블로그 : http://blog.naver.com/PostView.nhn?blogId=sendmade&logNo=80200881136&redirect=Dlog&widgetTypeCall=true [본문으로]
  3. 인라인 함수 특징과 장단점 : http://blog.naver.com/PostView.nhn?blogId=sendmade&logNo=80200881136&redirect=Dlog&widgetTypeCall=true (2016-07-19) [본문으로]
Posted by JunkMam
,