일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 비교 함수 객체
- 참조자
- 영화 리뷰
- more effective c++
- reference
- 오블완
- lua
- 영화
- 스마트 포인터
- 게임
- 다형성
- Vector
- c++
- 루아
- exception
- 예외
- 상속
- 메타테이블
- 티스토리챌린지
- implicit conversion
- 반복자
- operator new
- Smart Pointer
- virtual function
- Effective c++
- resource management class
- 언리얼
- 암시적 변환
- UE4
- effective stl
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 15. string 구현 방식 본문
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
'개발 > Effective STL' 카테고리의 다른 글
[Effective STL] 17. swap 트릭으로 vector 용량 줄이기 (0) | 2024.11.26 |
---|---|
[Effective STL] 16. C API로 컨테이너 전달 (0) | 2024.11.25 |
[Effective STL] 14. vector reserve (0) | 2024.11.21 |
[Effective STL] 13. 배열보다 vector (0) | 2024.11.20 |
[Effective STL] 12. 쓰레드 안전성 (0) | 2024.11.19 |
Comments