====== 널로 끝나는 문자열 ====== Null-terminated string (NTS) 또는 stringz (sz). [[컴퓨터]] [[메모리]] 상에서 [[문자열]]을 [[문자열표현|표현]]하는 방법으로, [[널문자]]가 문자열 맨 뒤에 붙어서 문자열의 끝을 가리킨다. [[C언어]]의 표준 문자열 표현 방법이며, [[Cpp]]에서도 C 스타일 문자열은 이 표현을 쓴다. 당연하지만 널문자를 문자열 안에 넣고 싶을 경우 이 표현을 쓸 수가 없다. 흔히 [[파스칼문자열]]과 비교된다. 문자열의 길이를 알아 내는 데 문자열 길이에 비례하는 시간이 걸린다는 지극히 당연하고도 자주 간과되는 문제를 가지고 있으며, [[Joel Spolsky]]는 《[[조엘온소프트웨어]]》에서 "러시안 페인트공 알고리즘"이라는 예제로 간접적으로 이를 비판했다. 그냥 C를 쓰지 않으면 될 것 같은데 ===== 널로 끝나는 문자열의 길이 ===== 보통 C의 ''strlen'' 함수는 단순한 루프로 구현되어 있을 것이라고 생각하기 쉬우나, 놀랍게도 이 함수를 더 효율적으로 구현하는 방법이 존재한다. 여러 바이트를 한꺼번에 읽고, 적절한 방법으로 그 안에 널 바이트가 있는지 체크한 뒤 없으면 그 바이트들을 한꺼번에 넘어 가는 것이다. [[루프펴기]]의 적절한 사용 예라 할 수 있는데 구체적으로는 두 가지 방법이 가능하다: * 주어진 숫자에 널 바이트가 들어 있으면 0을 반환하는 수식을 사용하기. 이런 수식은 한 둘이 아니며, 대표적인 예로는 [[http://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord|이거]]가 있다. * [[SIMD]] 명령을 재활용하기. 이를테면 [[MMX]]의 경우 ''[[http://ref.x86asm.net/coder64.html#x0F74|PCMPEQB]]'' 명령 같은 것을 쓴다. 후자는 최근 CPU의 SIMD 처리 능력이 비약적으로 향상하면서 점차 선호되는 추세이고, 전자는 플랫폼 독립적이라는 장점이 있다. {{tag>프로그래밍}}