embelog

Chapter2. 문자와 문자열로 작업하기 본문

Windows Via C++

Chapter2. 문자와 문자열로 작업하기

길동마누라 2021. 4. 18. 18:34

Unicode 문자기반 함수를 사용하자.

 

1. WhY?

 

 * 어플리케이션 지역화에 용이하다. (다국가 언어 지원 용이)

 * ANSI 문자 기반 함수는 성능이 떨어진다.

 

 

2. ANSI 문자 기반 함수가 성능이 떨어지는 이유?

 

 * ANSI 기반 함수 호출 시 윈도우는 내부적으로 ANSI 기반 문자열을 Unicode 기반 문자열로 바꾼다.

   이때, Unicode 를 위한 메모리 공간을 할당함으로서, 메모리 공간 낭비 발생

 

* 이후 Unicode 기반 문자열을 매개변수로, 윈도우는 ANSI 문자열 함수에 해당하는 Unicode 문자열 함수 호출 한다.

   (시간 낭비 발생)

 

* 만약 ANSI 문자 기반 함수가 ANSI 문자열을 반환하는 함수라면, Unicode 문자열을 다시 ANSI 문자열로

  반환해야 한다.

 

결과적으로 시간과 메모리 낭비가 발생한다.

 

3. 사용 예시 (C 런타임 안전 문자열 함수)

TCHAR szBuffer[10] = {
	TEXT('-'), TEXT('-'), TEXT('-'), TEXT('-'),TEXT('-'), 
    TEXT('-'), TEXT('-'), TEXT('-'), TEXT('-'),'\0'
}

errno_t result = _tcscpy_s( szBuffer, _countof( szBuffer ), TEXT( "0123456789" ) );

안전 문자열 함수는 내부적으로 인자의 유효성을 검증한다.

위의 예제의 경우, szBuffer의 크기가 충분하지 않으므로 실패한다.

"0123456789"의 종결문자 \0을 버퍼에 집어 넣을 수 없기 때문. 

실패하면 szBuffer의 첫번째 문자는 '\0'으로 설정되며, 나머지 메모리 공간은 0xfd로 변경된다.

 

참고로 변수 초기화값이 0xCC로 되어 있는데, 이는 버퍼 오버런을 체크하기 위해 사용.

'Windows Via C++' 카테고리의 다른 글

Chapter3. 커널 오브젝트1  (0) 2021.05.03
Chapter1. 에러 핸들링  (0) 2021.04.14
Chapter15. VirtualAlloc  (0) 2021.03.21