std :: string은 어떻게 구현됩니까?
std :: string이 구현되는 방법과 c string과 어떻게 다른지 알고 싶습니다. 표준이 구현을 지정하지 않으면 설명이있는 구현이 표준에 의해 주어진 문자열 요구 사항을 어떻게 충족하는지에 대해 훌륭할까요?
내가 사용한 거의 모든 컴파일러는 런타임을위한 소스 코드를 제공합니다. 따라서 GCC를 사용하든 MSVC를 사용하든 관계없이 구현을 볼 수 있습니다. 그러나 대부분 또는 전부가 std::string
템플릿 코드로 구현되어 읽기가 매우 어려울 수 있습니다.
Scott Meyer의 저서 인 Effective STL 에는 일반적인 변형에 대한 적절한 개요 인 std :: string 구현에 대한 장이 있습니다. "항목 15 : string
구현 의 변형에주의 ".
그는 4 가지 변형에 대해 이야기합니다.
ref-counted 구현의 여러 변형 (일반적으로 copy on write라고 함)-문자열 객체가 변경되지 않은 상태로 복사되면 refcount가 증가하지만 실제 문자열 데이터는 그렇지 않습니다. 두 객체는 하나의 객체가 데이터를 수정할 때까지 동일한 참조 데이터를 가리켜 데이터의 '쓰기시 복사'가 발생합니다. 변형은 refcount, 잠금 등이 저장되는 위치에 있습니다.
"짧은 문자열 최적화"(SSO) 구현. 이 변형에서 객체는 데이터, 길이, 동적으로 할당 된 버퍼의 크기 등에 대한 일반적인 포인터를 포함합니다. 그러나 문자열이 충분히 짧으면 버퍼를 동적으로 할당하는 대신 해당 영역을 사용하여 문자열을 보유합니다.
또한 Herb Sutter의 "More Exceptional C ++" 에는 동기화 문제로 인해 Copy on Write refcounted 구현이 종종 멀티 스레드 응용 프로그램에서 성능 문제가 발생하는 이유를 설명하는 부록 (부록 A : "(멀티 스레드 환경에없는) 최적화")이 있습니다. 이 기사는 온라인에서도 볼 수 있습니다 (하지만 책에있는 내용과 정확히 일치하는지 잘 모르겠습니다).
두 장 모두 읽을 가치가 있습니다.
std :: string은 일종의 내부 버퍼를 감싸고 해당 버퍼를 조작하기위한 메서드를 제공하는 클래스입니다.
C의 문자열은 문자의 배열 일뿐입니다.
여기서 std :: string이 어떻게 작동하는지에 대한 모든 뉘앙스를 설명하는 것은 너무 오래 걸립니다. gcc 소스 코드 http://gcc.gnu.org 를 살펴보면 정확히 어떻게 작동하는지 알 수 있습니다.
이 페이지의 답변에 예제 구현 이 있습니다.
또한 gcc가 설치되어 있다고 가정하면 gcc의 구현을 볼 수 있습니다. 그렇지 않은 경우 SVN을 통해 소스 코드에 액세스 할 수 있습니다 . std :: string의 대부분은 basic_string 에 의해 구현 되므로 거기서 시작하십시오.
정보의 또 다른 가능한 소스는 Watcom의 컴파일러입니다.
문자열에 대한 C ++ 솔루션은 C 버전과 상당히 다릅니다. 첫 번째이자 가장 중요한 차이점은 c가 ASCIIZ 솔루션을 사용하는 반면 std :: string 및 std :: wstring은 실제 문자열을 저장하기 위해 두 개의 반복자 (포인터)를 사용한다는 것입니다. 문자열 클래스의 기본 사용법은 동적 할당 솔루션을 제공하므로 동적 메모리 처리와 함께 CPU 오버 헤드 비용으로 인해 문자열 처리가 더 편안해집니다.
이미 알고 있듯이 C에는 내장 된 일반 문자열 유형이 포함되어 있지 않으며 표준 라이브러리를 통해 몇 가지 문자열 작업 만 제공됩니다. C ++가 래핑 된 기능을 제공하는 C와 C ++의 주요 차이점 중 하나이므로 가짜 제네릭 유형으로 간주 할 수 있습니다.
C에서 문자열의 길이를 알고 싶다면 문자열을 살펴 봐야합니다. std :: string :: size () 멤버 함수는 기본적으로 하나의 명령어 (end-begin) 일뿐입니다. 메모리가있는 한 문자열을 서로 안전하게 추가 할 수 있으므로 필요한 경우 추가하면 더 큰 버퍼가 생성되기 때문에 버퍼 오버플로 버그 (및 악용)에 대해 걱정할 필요가 없습니다.
이전에 누군가가 말했듯이 문자열은 템플릿 방식으로 벡터 기능에서 파생되므로 멀티 바이트 문자 시스템을 더 쉽게 다룰 수 있습니다. typedef std :: basic_string specific_str_t를 사용하여 고유 한 문자열 유형을 정의 할 수 있습니다. 템플릿 매개 변수에서 임의의 데이터 유형이있는 표현식.
충분한 찬반 양측이 있다고 생각합니다.
C ++ 문자열 장점 :-특정 경우에 더 빠른 반복 (확실히 크기를 사용하고 두 포인터를 비교하여 문자열의 끝에 있는지 확인하기 위해 메모리의 데이터가 필요하지 않습니다. 캐싱)-버퍼 작업에는 문자열 기능이 포함되어 있으므로 버퍼 문제에 대한 걱정이 줄어 듭니다.
C ++ 문자열 단점 :-동적 메모리 할당으로 인해 기본 사용이 성능에 영향을 줄 수 있습니다. (다행히도 원래 버퍼 크기를 문자열 객체에 알릴 수 있으므로 초과하지 않는 한 메모리에서 동적 블록을 할당하지 않습니다)-종종 다른 언어에 비해 이상하고 일관성이없는 이름입니다. 이것은 모든 stl에 대한 나쁜 점이지만 사용할 수 있으며 약간 구체적인 C ++ 느낌을줍니다. -템플릿을 많이 사용하면 표준 라이브러리가 헤더 기반 솔루션을 사용하므로 컴파일 시간에 큰 영향을 미칩니다.
사용하는 표준 라이브러리에 따라 다릅니다.
예를 들어 STLPort 는 문자열을 구현하는 C ++ 표준 라이브러리 구현입니다.
참조 URL : https://stackoverflow.com/questions/1466073/how-is-stdstring-implemented
'IT이야기' 카테고리의 다른 글
C ++ 싱글 톤 대 전역 정적 개체 (0) | 2021.04.08 |
---|---|
SELECT 문에서 BOOLEAN 유형을 사용하는 방법 (0) | 2021.04.08 |
SQL IN 연산자에 해당하는 linq는~? (0) | 2021.04.08 |
ASP.NET MVC3의 부분보기에서 ViewBag에 액세스 할 수 없습니다. (0) | 2021.04.08 |
DbContext 스레드는 안전할까? (0) | 2021.04.08 |