스토리텔링 개발자

[Effective STL] 15. string 구현 방식 본문

개발/Effective STL

[Effective STL] 15. string 구현 방식

김디트 2024. 11. 22. 11:20
728x90

항목 15. 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을

 

 

 

string의 구현 방식은 갖가지가 될 수 있다
  • 비야네 스트로스트럽(Bjarne Stroucstrup)가 쓴 글, "Sixteen Ways to Stack a Cat"

 

 

 

string 객체의 크기는 얼마일까
  • sizeof(string)를 하면 얼마가 나올까?
  • 이에 대한 답은 하나가 아니다.
    • char* 포인터 크기와 같은 경우도 있고,
    • string의 크기가 char*의 무려 일곱 배나 되는 경우도 있다.

 

 

 

string이 가져야 하는 정보
  • 필수적으로 가지는 정보
    • 문자열의 크기(즉 길이)(size)
    • 문자를 담아두는 메모리 용량(capacity)
    • 문자열의 값(문자들)(value)
  • 선택적으로 더 추가될 수 있는 정보
    • 할당자의 사본(항목 10 참조) (allocator)
    • 참조 카운팅을 지원할 경우, 문자열 값에 대한 참조 카운트(ref cnt)

 

 

 

string 구현 타입 예시들

  • 구현 타입 A
    • 기본 할당자를 사용할 경우 포인터의 네 배 크기이다.
    • 할당자 사본, 문자열 크기, 용량, 문자열 값을 담는 동적 할당 버퍼 포인터, 참조 카운트

  • 구현 타입 B
    • 포인터와 크기가 같다.
    • 기본 할당자를 사용한다고 가정하고 포인터로만 구현되었다.
    • 문자열 크기, 용량, 참조 카운트, 문자열 값을 가지는 동적 할당 버퍼 포인터
    • 다중 쓰레드 환경을 고려한 데이터 몇 개가 더 들어 있다.(other)
      • 그림에서와 같이, 이는 메모리를 많이 잡아먹는다.

  • 구현 타입 C
    • 포인터와 크기가 같다.
    • 포인터의 동적 할당 버퍼 안에 모든 것이 들어있다는 것이 B와 다른 점이다.
    • 문자열 크기, 용량, 참조 카운트, 문자열 값
    • 문자열 값 공유 처리 관련 데이터도 있었으나, 현재 고려대상이 아니라 'x' 표시
      • 참조 카운팅으로 관리되는 데이터 값인데도 초기 상태에서 공유되지 않게 세팅할 수 있는 경우에 대한 데이터(MEC++ 항목 29 참조)

  • 구현 타입 D
    • 기본 할당자를 사용할 경우, 포인터 크기의 7배 크기
    • 참조 카운팅을 전혀 지원하지 않는다.
    • 15char 분의 문자열을 담을 수 있는 내부 버퍼가 있다.
      • 단문자열 최적화(small string optimization)

 

 

 

각 타입을 예시로 알아보기
string s("Perse");
메모리 할당
  • D 타입
    • 메모리 할당이 전혀 일어나지 않는다.
  • A, C 타입
    • 한 번의 할당이 발생한다.
  • B 타입
    • 두 번의 할당이 발생한다.
다중 쓰레딩
  • B 타입
    • 동시성 제어용 자료구조와 레퍼런스 카운트가 있다.
  • A, C 타입
    • 레퍼런스 카운트가 있다.
  • D 타입
    • 지원하지 않는다.
참조 카운팅 기반 설계
  • A 타입
    • value 값만 공유한다.
  • B, C 타입
    • 크기, 용량까지 공유하여 비용이 대폭 줄어든다.
    • C 타입은 할당자까지 공유한다.(항목 10 참조)
  • D 타입
    • 공유를 지원하지 않는다.
짧은 문자열 메모리 할당 정책
  • A 타입
    • 최소 할당 크기가 정해져 있으며, 32문자이다.(널 문자 포함)
    • "Perse"의 크기는 5이지만, 용량은 마지막 널 문자를 제외한 31을 할당한다.
  • C 타입
    • 최소 할당 크기가 정해져 있으며, 16문자이다.(널 문자 미포함)
    • 널 문자를 예약하지 않으므로 용량은 16이다.
  • D 타입
    • 최소 할당 크기가 정해져 있으며, 16문자이다.(널 문자 포함)
    • 하지만, 16문자보다 작으면 버퍼 할당 없이 내부에 저장한다.
  • B 타입
    • 최소 할당 정책이 없다.

 

 

 

최소 메모리 할당 정책
  • 아래와 같은 상황일 때 염두하자.
  • 짧은 문자열을 많이 사용하는데,
  • 배포 환경에서 매우 적은 메모리만이 허용되거나.
  • 참조 위치의 특정성(locality of reference)을 고려하여 관련된 문자열을 몇 개의 페이지 별로 모아서 관리해야 하거나.

 

 

 

정리
  • string의 문자열 값은 참조 카운팅일수도 아닐 수도 있다.(문자열 참조 카운팅은, 항목 13 참조)
  • string 객체 자체의 크기는 다양하다.(1배 ~ 7배)
  • 문자열을 새로 생성할 때 필요한 메모리 할당의 횟수는 다양하다.(0번 ~ 2번)
  • string 객체는 문자열 크기나 용량 정보를 가지고 있을 수도, 아닐 수도 있다.
  • 문자 버퍼를 위해 할당하는 메모리 최소량에 대한 정책은 다양하다.
728x90
Comments