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에서 컴파일을 하지 않을 경우란, 리눅스에서 사용할 경우가 해석이 될 수 있다.)
설명을 본다면, 함수의 속도를 높이기 위해서 사용을 한다. 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에 의해서 오류가 발생하게 된다.
일부는 나중에 더 적는걸로...
- 참조 : https://msdn.microsoft.com/ko-kr/library/bw1hbe6y.aspx(2016-07-19) [본문으로]
- 인라인 함수 특징과 장단점을 설명하는 블로그 : http://blog.naver.com/PostView.nhn?blogId=sendmade&logNo=80200881136&redirect=Dlog&widgetTypeCall=true [본문으로]
- 인라인 함수 특징과 장단점 : http://blog.naver.com/PostView.nhn?blogId=sendmade&logNo=80200881136&redirect=Dlog&widgetTypeCall=true (2016-07-19) [본문으로]
'연습' 카테고리의 다른 글
Kompozer - 웹에디터 (0) | 2016.07.22 |
---|---|
MCM ver 0.83의 Util.hpp 소스 분석_2 (0) | 2016.07.21 |
Windows API 프로그래밍 -19. 캐럿 출력하기. - (0) | 2016.07.19 |
최근 나오는 비디오 코덱 daala (0) | 2016.07.18 |
MCM ver 0.83의 Util.hpp 소스 일부 분석. (0) | 2016.07.17 |