C와 C ++를 좋아하는 한, null로 끝나는 문자열을 선택할 때 머리를 긁을 수는 없습니다.
- C 앞에 존재하는 길이 접두사 (즉, 파스칼) 문자열
- 길이 접두사 문자열은 일정한 시간 길이 조회를 허용하여 여러 알고리즘을 더 빠르게 만듭니다.
- 접두사가 붙은 길이의 문자열은 버퍼 오버런 오류를 발생시키기 어렵습니다.
- 32 비트 시스템에서도 문자열이 사용 가능한 메모리의 크기가되도록 허용하면 접 두부 길이가 null로 끝나는 문자열보다 3 바이트 만 넓습니다. 16 비트 시스템에서는 단일 바이트입니다. 64 비트 시스템에서 4GB는 적절한 문자열 길이 제한이지만,이를 기계어 크기로 확장하려는 경우에도 64 비트 시스템에는 일반적으로 여분의 7 바이트를 널 인수로 만드는 충분한 메모리가 있습니다. 나는 원래의 C 표준이 미친 듯이 가난한 기계 (메모리 측면에서)를 위해 쓰여 졌음을 알고 있지만 효율성 주장은 나를 여기에 팔지 않습니다.
- 다른 모든 언어 (예 : Perl, Pascal, Python, Java, C # 등)는 접두사가 붙은 문자열을 사용합니다. 이러한 언어는 문자열 조작 벤치 마크에서 문자열보다 효율적이기 때문에 일반적으로 C를 능가합니다.
- C ++은
std::basic_string
템플릿으로 이것을 약간 수정 했지만 null로 끝나는 문자열을 기대하는 일반 문자 배열은 여전히 널리 퍼져 있습니다. 힙 할당이 필요하기 때문에 불완전합니다. - 널 종료 문자열은 문자열에 존재할 수없는 문자 (즉, 널)를 예약해야하며, 접 두부 길이의 문자열에는 널이 포함될 수 있습니다.
이러한 것 중 일부는 C보다 최근에 밝혀 졌으므로 C가 알지 못하는 것이 합리적입니다. 그러나 C가 나오기 전에는 몇 가지가 분명했습니다. 명백하게 우수한 길이 접두사 대신 널 종료 문자열이 선택된 이유는 무엇입니까?
편집 : 일부는 위의 효율성 점에 대해 사실을 요구하고 (내가 이미 제공 한 것을 좋아하지 않기 때문에 ) 몇 가지 사항에서 비롯됩니다.
- 널 종료 문자열을 사용하는 Concat에는 O (n + m) 시간 복잡성이 필요합니다. 길이 접두사는 종종 O (m) 만 필요합니다.
- 널 종료 문자열을 사용하는 길이에는 O (n) 시간 복잡성이 필요합니다. 길이 접두사는 O (1)입니다.
- 길이와 연결은 가장 일반적인 문자열 연산입니다. 널 종료 문자열이 더 효율적일 수있는 몇 가지 경우가 있지만 훨씬 덜 자주 발생합니다.
아래 답변에서 null로 끝나는 문자열이 더 효율적인 경우가 있습니다.
- 문자열의 시작 부분을 잘라 내야하며 어떤 방법으로 전달해야 할 때. 길이 접두어가 정렬 규칙을 따라야하기 때문에 원래 문자열을 제거 할 수 있더라도 길이 접두사가있는 일정한 시간에 실제로이 작업을 수행 할 수 없습니다.
- 문자열 문자를 문자별로 반복하는 경우 CPU 레지스터를 저장할 수 있습니다. 이것은 문자열을 동적으로 할당하지 않은 경우에만 작동합니다 (그런 다음 문자열을 해제해야하기 때문에 원래 malloc 및 친구들로부터 얻은 포인터를 유지하기 위해 저장 한 CPU 레지스터를 사용해야합니다).
위의 어느 것도 길이와 concat만큼 일반적이지 않습니다.
아래 답변에 더 많은 주장이 있습니다.
- 줄 끝을 잘라 내야합니다
그러나 이것은 잘못되었습니다-null로 끝나고 길이가 앞에 붙은 문자열과 동일한 시간입니다. (널로 끝나는 문자열은 새 끝을 원할 경우 null을 붙이고 길이 접두사는 접두사에서 뺍니다.)