이 답변 은 짧은 문자열 최적화 (SSO)에 대한 멋진 고급 개요를 제공합니다. 그러나 실제로 libc ++ 구현에서 어떻게 작동하는지 더 자세히 알고 싶습니다.
SSO 자격을 얻으려면 문자열이 얼마나 짧아야합니까? 이것은 대상 아키텍처에 따라 달라 집니까?
구현시 문자열 데이터에 액세스 할 때 짧은 문자열과 긴 문자열을 어떻게 구분합니까?
m_size <= 16
다른 멤버 변수의 일부인 플래그 만큼 간단 합니까? (m_size
또는 그 일부가 문자열 데이터를 저장하는 데 사용될 수도 있다고 생각합니다 ).
SSO를 사용한다는 것을 알고 있기 때문에 libc ++에 대해 특별히이 질문을했습니다. 이것은 libc ++ 홈페이지 에 언급되어 있습니다.
출처를 살펴본 후 몇 가지 관찰 사항은 다음과 같습니다. .
libc ++는 문자열 클래스에 대해 약간 다른 두 가지 메모리 레이아웃으로 컴파일 할 수 있습니다 _LIBCPP_ALTERNATE_STRING_LAYOUT
. 이것은 플래그 에 의해 관리됩니다 . 두 레이아웃 모두 리틀 엔디안 머신과 빅 엔디안 머신을 구분하므로 총 4 가지 변형이 있습니다. 나는 다음에서 "일반적인"레이아웃과 리틀 엔디안을 가정 할 것이다.
추가 size_type
로 4 바이트이고 value_type
1 바이트 라고 가정하면 다음은 문자열의 처음 4 바이트가 메모리에서 보이는 것과 같습니다.
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
짧은 문자열의 크기는 상위 7 비트에 있으므로 액세스 할 때 이동해야합니다.
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
마찬가지로, 긴 문자열의 용량에 대한 getter 및 setter __long_mask
는 is_long
비트 를 처리 하는 데 사용 합니다 .
나는 여전히 내 첫 번째 질문에 대한 답을 찾고 있습니다. __min_cap
, 짧은 문자열의 용량이 다른 아키텍처에 대해 까요?
기타 표준 라이브러리 구현
이 답변 은 std::string
다른 표준 라이브러리 구현 의 메모리 레이아웃에 대한 멋진 개요를 제공합니다 .
string
헤더를 찾을 수 있습니다 . 지금 확인 중입니다. :)