이것은 문서의 이전 버전입니다!


널로 끝나는 문자열

Null-terminated string (NTS) 또는 stringz (sz). 컴퓨터 메모리 상에서 문자열표현하는 방법으로, 널문자가 문자열 맨 뒤에 붙어서 문자열의 끝을 가리킨다. C의 표준 문자열 표현 방법이며, C++에서도 C 스타일 문자열은 이 표현을 쓴다. 당연하지만 널문자를 문자열 안에 넣고 싶을 경우 이 표현을 쓸 수가 없다. 흔히 파스칼문자열과 비교된다.

문자열의 길이를 알아 내는 데 문자열 길이에 비례하는 시간이 걸린다는 지극히 당연하고도 자주 간과되는 문제를 가지고 있으며, Joel Spolsky는 《조엘온소프트웨어》에서 "러시안 페인트공 알고리즘"이라는 예제로 간접적으로 이를 비판했다. 그냥 C를 쓰지 않으면 될 것 같은데

널로 끝나는 문자열의 길이

보통 C의 strlen 함수는 단순한 루프로 구현되어 있을 것이라고 생각하기 쉬우나, 놀랍게도 이 함수를 더 효율적으로 구현하는 방법이 존재한다. 여러 바이트를 한꺼번에 읽고, 적절한 방법으로 그 안에 널 바이트가 있는지 체크한 뒤 없으면 그 바이트들을 한꺼번에 넘어 가는 것이다. 루프펴기의 적절한 사용 예라 할 수 있는데 구체적으로는 두 가지 방법이 가능하다:

  • 주어진 숫자에 널 바이트가 들어 있으면 0을 반환하는 수식을 사용하기. 이런 수식은 한 둘이 아니며, 대표적인 예로는 이거가 있다.
  • SIMD 명령을 재활용하기. 이를테면 MMX의 경우 PCMPEQB 명령 같은 것을 쓴다.

후자는 최근 CPU의 SIMD 처리 능력이 비약적으로 향상하면서 점차 선호되는 추세이고, 전자는 플랫폼 독립적이라는 장점이 있다.


도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2011-08-31 11:07 | 외부 편집기