목표: basic_string에 대한 기초적인 이해 (char로 특수화된 string으로)

!주의!

- 실제 각 컴파일러의 STL 구현과는 다름

- 포인터와 템플릿을 아주 기초적인 수준에서 이해하는 사람들을 대상으로 함

- 작성자가 틀릴 수 있으니 권위있는 자료를 우선시 할 것(C++ 표준 스펙 문서, cppreference 등)


1. string이란? char[]와의 차이

- 자동 메모리 관리 기능: char[]와 달리 프로그래머가 직접 메모리를 관리할 필요가 없거나 적어짐

- 안전성 및 편의성: 문자열과 관련한 함수들을 편리하고 안전하게 쓸 수 있음


2. string 클래스의 기본 구조 (string 멤버 변수)

- `CharT* data`: 실제 문자 데이터를 가리키는 포인터

-  `size_t size`: 문자열의 길이

-  `size_t capacity`: 할당된 저장 공간의 크기(size와 같거나 큼)


실제로는 아래와 같은 구조에 가까움


- `std::char_traits<>`로 char, wchar_t 등에 해당하는 각각의 문자(Character) 타입에 특수화된 구조를 결정함

- `std::allocator<>`로 타입별 메모리 할당 방법을 결정함


3. string 구현해보기

- 모두의코드: https://modoocode.com/198


4. string 사용시 유의 사항

- 메모리 할당 실패, 잘못된 접근 등의 예외에 대한 처리가 필요할 수 있음

- 빈번한 문자열 변경(부분 변경 포함), 아주 큰 크기의 데이터 처리에는 성능에 하자 있음


5. SSO, string_view, string literal 등

- Small String Optimization (SSO): 동적 메모리 할당을 피하기 위해 작은 크기의 문자열 공간을 미리 준비함. 이건 이미 대부분의 STL 구현체에 있음



- string_view: C++17에서 도입된 것으로 문자열 데이터를 소유하지 않고 참조만을 제공함



- Raw string literals: string literal은 컴파일 시간에 결정되어 프로그램에 포함된 문자열을 말함(변경 불가). 그 중에서 특수 문자 등을 편리하게 처리하기 위한 Raw string literals가 있음. char의 경우엔 아래의 예시를 참조


6. 최적화

- zip 같은 포맷으로 압축, std::vector로 처리 후 reverse한 string에 할당, 메모리 풀 사용 등의 처리하고자 하는 데이터에 따라 다양한 방법이 존재

- C++20 이상의 표준 혹은 header-only 라이브러리로 문자열 입출력에 대해서도 빠르게 처리할 방법이 있음


미루고 미루다가 썼네. 많이 모자란 내용인 거 같지만 보충 안 할래