C+string 의 내부 가 어떤 지 깊이 탐구 하 다.

2596 단어 c + +string내부
C 언어 에서 문자열 을 표시 하 는 두 가지 방법 이 있 습 니 다.
  • 하 나 는 문자 배열 로 문자열 을 수용 하 는 것 입 니 다.예 를 들 어 char str[10]="abc"와 같은 문자열 은 읽 고 쓸 수 있 습 니 다
  • 하 나 는 문자열 상수,예 를 들 어 char*str="abc"를 사용 하 는 것 입 니 다.이런 문자열 은 읽 을 수 있 고 쓸 수 없습니다.
  • 두 가지 형식 은 항상\0 을 끝 표지 로 한다.
    C+string 은 C 언어 에서 의 전신 과 는 전혀 다르다.우선,가장 중요 한 차이 점 이기 도 합 니 다.C+string 은 포함 하 는 문자 배열 의 물리 적 표 시 를 숨 겼 습 니 다.프로그램 설계 자 는 배열 의 차원 이나\0 방면 의 문제 에 관심 을 가 질 필요 가 없다.
    string 은 내부 에 메모리 와 용량 에 관 한 정 보 를 밀봉 했다.구체 적 으로 말 하면 C+string 대상 은 메모리 의 시작 위치,포 함 된 문자 시퀀스 와 문자 시퀀스 의 길 이 를 알 고 있 습 니 다.메모리 공간 이 부족 할 때 string 은 모든 문자 배열 을 수용 할 수 있 는 크기 로 메모리 공간 을 자동 으로 조정 합 니 다.
    C+string 의 이러한 방법 은 C 언어 프로 그래 밍 에서 가장 흔 하고 파괴 적 인 세 가지 오 류 를 크게 감소 시 켰 다.
    4.567917.배열 이 경 계 를 넘는다4.567917.초기 화 되 지 않 거나 잘못된 값 의 지침 을 통 해 배열 원 의 장 애 를 방문 합 니 다4.567917.배열 이 차지 하 는 메모 리 를 방출 했 지만'허공'지침 을 유지 했다.
    C++표준 은 string 류 의 메모리 레이아웃 을 정의 하지 않 았 습 니 다.각 컴 파일 러 업 체 는 서로 다른 실현 을 제공 할 수 있 지만 string 의 행동 이 일치 하도록 해 야 합 니 다.이런 방법 을 채택 하 는 것 은 충분 한 유연성 을 얻 기 위해 서 이다.
    특히,C++표준 은 어떤 정확 한 상황 에서 string 대상 에 게 메모리 공간 을 할당 하여 문자 순 서 를 저장 해 야 하 는 지 정의 하지 않 았 습 니 다.string 메모리 할당 규칙 은 명확 하 게 규정 되 어 있 습 니 다.허용 되 지만 참조 계수(reference counting)로 이 루어 지 는 것 을 요구 하지 않 습 니 다.그러나 인용 계 수 를 사용 하 든 말 든 그 의 미 는 일치 해 야 한다.
    C++의 이러한 방법 은 C 언어 와 달리 C 언어 에서 모든 문자 배열 은 각자 의 물리 적 저장 소 를 차지한다.C++에서 독립 된 몇 개의 string 대상 이 차지 할 수도 있 고 각자 의 특정한 물리 적 저장 소 를 차지 하지 않 을 수도 있 습 니 다.그러나 인용 계수 로 같은 데 이 터 를 저장 하 는 복사 본 을 피 할 수 있다 면 각 독립 된 대상(처리 상)은 각자 의 저장 소 를 독점 적 으로 가지 고 있 는 것 처럼 보 여야 합 니 다.예 를 들 면:
    
    // #include<bits/stdc++.h>
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main() {
     string s1("12345");
     string s2 = s1;
     cout << (s1 == s2) << endl;
     s1[0] = '6';
     cout << "s1 = " << s1 << endl; // 62345
     cout << "s2 = " << s2 << endl; // 12345
     cout << (s1 == s2) << endl;
     
     return 0;
    }
    
    GCC 에서 의 실행 결과:
    1
    s1 = 62345
    s2 = 12345
    0
    문자열 이 수정 되 었 을 때 만 각자 의 복사 본 을 만 듭 니 다.이 를 작성 할 때 복사(copy-on-write)정책 이 라 고 합 니 다.문자열 이 값 매개 변수(value parameter)나 다른 읽 기 전용 상황 에서 만 사용 되면 시간 과 공간 을 절약 할 수 있 습 니 다.
    라 이브 러 리 의 실현 이 인용 계 수 를 사용 하 든 말 든 string 류 사용자 에 게 는 투명 해 야 합 니 다.안 타 깝 게 도 상황 이 늘 그렇지 는 않다.다 중 스 레 드 프로그램 에 서 는 인용 수 를 안전하게 사용 할 수 없다.
    C++string 의 내부 가 어떤 것 인지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C++string 내부 가 어떤 내용 인지 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기