TR1 Extensions Reference가 Open 되었내요. 꽤나 흥미 진진합니다.
Tag Archive for 'Application'
MS 의 strlen Function의 동작이 하나하나의 char 를 세어서 NULL 문자가 나올때의 count를 리턴하는 것으로 잘못알고 계신경우가 상당히 많더군요. 하지만 실제로 같은 코드를 만들어 MS가 제공하는 strlen Function과 비교하면 상당한 차이가 있습니다.
이 궁금증을 풀기위해서 실제 코드를 보게 되면
...
msvcrt!strlen+0x20:
77bf78c0 8b01 mov eax,dword ptr [ecx]
77bf78c2 bafffefe7e mov edx,7EFEFEFFh
77bf78c7 03d0 add edx,eax
77bf78c9 83f0ff xor eax,0FFFFFFFFh
77bf78cc 33c2 xor eax,edx
77bf78ce 83c104 add ecx,4
77bf78d1 a900010181 test eax,81010100h
77bf78d6 74e8 je msvcrt!strlen+0×20 (77bf78c0)
…
이와 같은 코드를 찾을 수 있습니다. 바로 NULL terminate 문자를 찾는 과정입니다. 4byte 단위로 읽어 Bit 연산을 통해서 NULL terminate문자를 찾는 걸 확인할 수 있습니다. 물론 이정도 코드도 일반적으로 사용하기에는 큰 문제가 없습니다. 하지만 좀더 빠른 코드를 원한다면 아래와 같이 코드를 작성할 수있습니다.
...
43 00411694 8b18 mov ebx,dword ptr [eax]
44 00411696 83c004 add eax,4
45 00411699 8d8bfffefefe lea ecx,[ebx-1010101h]
46 0041169f f7d3 not ebx
47 004116a1 23cb and ecx,ebx
48 004116a3 81e180808080 and ecx,80808080h
49 004116a9 74e9 je strlen!strlen+0×24 (00411694)
…
Bit 연산을 줄여 속도를 개선한 방법입니다. 이 방법은 Software Optimizing을 위해서 Agner Fog에 의해 고안된 방법으로 긴 문자열을 처리할때 꽤 유용하게 사용이 가능합니다.
참고 사이트
Agner Fog의 Blog : http://www.agner.org/
Unicode Api ( Windows SDK, STL , CRT … ) 를 사용하다 보면 Locale 설정으로 인한 원하지 않는 동작을 하곤합니다. 예를 들면 fprintf로 File에 문자열을 Write 할 경우 한글이 “??”와 같은 형태로 찍힌다던가 basic_ofstream의 write Function이 동작하지 않는 다던가 하는 경우들 말이죠. 이럴 경우는 Locale 을 한번 의심해 보시는게 도움이 되실꺼 같습니다.
Locale 은 개발자가 각 나라의 OS에 맞춰서 언어, 시간, 날짜 등을 선택할 수 있도록 해줍니다. 아래의 Function들은 Local 관련 Function 들입니다.
Windows SDK :
BOOL SetLocaleInfo( LCID Locale, LCTYPE LCType, LPCTSTR lpLCData );
STL :
locale Class
CRT :
char * setlocale( int category, const char * locale );
wchar_t * _wsetlocale( int category, const wchar_t *locale );
Unicode 작업시 꼭 유념해야할 부분입니다.
최근 답글