본문 바로가기
클립보드

C++ 문자열의 내부 구조: std::string 이해하기

by stdafx.h 2023. 10. 30.
반응형

 

C++ 표준 라이브러리의 std::string은 단순히 문자의 벡터로 생각될 수 있지만, 실제로는 벡터와는 다른 특정 최적화가 적용된 조직으로 되어 있습니다. 모든 문자열은 내부적으로 ptr (문자열의 시작을 가리키는 포인터), size (널 종결자를 제외한 문자의 수), capacity (널 종결자를 제외한 문자열의 용량)으로 구성된 std::basic_string 구조에서 시작합니다.

작은 문자열 최적화(Small String Optimization)
이러한 기본 구조에 추가된 중요한 개념은 '작은 문자열 최적화(Small String Optimization, SSO)'입니다. 벡터와 달리, 문자열은 이동 연산 시 반복자나 참조가 무효화되지 않아도 되므로, 문자열 객체 내부에 작은 버퍼를 할당하여 짧은 문자열의 경우 별도의 메모리 할당 없이 이 버퍼를 사용할 수 있습니다.

다양한 C++ 라이브러리 구현 비교
GCC 표준 라이브러리는 내부 버퍼인 buf를 사용할 때 capacity를 명시적으로 기록할 필요가 없다고 판단하여 capacity와 buf를 중첩시킵니다. 

반면, Microsoft 표준 라이브러리는 capacity를 검사하여 내부 버퍼 사용 여부를 판단하며, 이 라이브러리 또한 내부 버퍼를 16바이트로 설정합니다.
Clang은 더 극단적인 수준의 최적화를 적용하여, 문자열이 외부 할당을 사용하는지 아니면 SSO를 사용하는지를 첫 번째 바이트의 최하위 비트로 구분합니다. 작은 문자열의 경우 첫 번째 바이트의 최하위 비트가 설정되고, 나머지 비트들은 문자열의 크기를 나타냅니다.

디버깅: std::string과 std::wstring 내부 살펴보기
Visual Studio 디버거를 사용하여 std::string과 std::wstring의 내용을 보다 편리하게 볼 수 있는 시각화 도구가 포함되어 있지만, 수동으로 내용을 확인해야 할 때 Microsoft 표준 라이브러리 구현을 사용하는 방법을 알려줍니다. 이 블로그 시리즈의 주 목적 중 하나는 크래시 덤프에서 이러한 표준 라이브러리 데이터 구조의 내용을 확인할 수 있도록 필요한 정보를 제공하는 것입니다.

 

반응형