본문 바로가기

C/C++

SSO (short string optimization)

c++에 SSO (Short String Optimization) 라는 개념이 있다.

Effective Modern C++ 책을 보다가 검색한 걸 정리해 본다.

[1]의 내용을 정리한 것이다.




new/malloc를 사용하지 않고 배열로 만든 문자열은 스택에 저장이 되는데,

이는 new/malloc를 사용하여 힙에 메모리를 할당한 것보다 속도면에서 빠르다.


그러나 배열은 고정된 사이즈를 사용해야 하는 반면, new/malloc를 사용하면 동적으로 사이즈를 정할 수 있다.

또한 스택의 크기는 제한적인 반면, 힙 영역은 시스템 메모리 만큼 사용할 수 있다.


std::string는 보통 힙영역에 문자열을 저장한다. (new char [size]를 한 것처럼)

이렇게 해야 아주 큰 문자열도 스택 오버플로우 없이 저장할수 있으니까.

그러나 힙을 사용하기 때문에 속도가 좀 느리며, 복사를 할때 특히 더 느리다.


그래서 내부적으로 char[20]과 같은 작은 배열을 두어서 (이는 스택 영역에 저장하니까)

작은 문자열을 처리할때 좀더 속도를 올릴수 있도록 설계를 하였다.


이런 식으로

class string {
public:
    // all 83 member functions
private:
    std::unique_ptr<char[]> m_data;
    size_type m_size;
    size_type m_capacity;
    std::array<char, 16> m_sso;
};


SSO는 수많은 응용 프로그램에서 짧은 문자열들이 통상적으로 쓰인다는 방대한 증거에서 비롯된 기법이다.

그런 문자열의 내용을 버퍼에 저장하면 메모리를 동적으로 할당할 필요가 없으며, 그러면 대체로 효율성이 좋아진다. 그러나 이는 이동이 복사보다 빠르지 않다는 결과를 낳는다.

 - Effective Modern C++, 220p


<출처>

1. http://stackoverflow.com/questions/10315041/meaning-of-acronym-sso-in-the-context-of-stdstring

2. Effective Modern C++