embelog
Chapter2. 문자와 문자열로 작업하기 본문
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 |