Tag Archive for 'Application'

Standard C++ Library TR1 Extensions Reference

TR1 Extensions Reference가 Open 되었내요. 꽤나 흥미 진진합니다.

http://msdn2.microsoft.com/en-us/library/bb982198.aspx

strlen Optimizing

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/

Locale에 관한 이야기

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 작업시 꼭 유념해야할 부분입니다.