Significado del acrónimo SSO en el contexto de std::string

Resuelto Raedwald asked hace 12 años • 3 respuestas

En una pregunta de C++ sobre optimización y estilo de código , varias respuestas se referían a "SSO" en el contexto de la optimización de copias de std::string. ¿Qué significa SSO en ese contexto?

Claramente no es "inicio de sesión único". ¿"Optimización de cadenas compartidas", tal vez?

Raedwald avatar Apr 25 '12 18:04 Raedwald
Aceptado

Antecedentes / Descripción general

Las operaciones con variables automáticas ("desde la pila", que son variables que se crean sin llamar a malloc/ new) son generalmente mucho más rápidas que las que involucran la tienda gratuita ("el montón", que son variables que se crean usando new). Sin embargo, el tamaño de las matrices automáticas se fija en el momento de la compilación, pero el tamaño de las matrices de la tienda gratuita no. Además, el tamaño de la pila es limitado (normalmente unos pocos MiB), mientras que el almacenamiento gratuito sólo está limitado por la memoria de su sistema.

SSO es la optimización de cadenas cortas/pequeñas. A std::stringnormalmente almacena la cadena como un puntero al almacén gratuito ("el montón"), lo que proporciona características de rendimiento similares a las de si llamara a new char [size]. Esto evita un desbordamiento de la pila para cadenas muy grandes, pero puede ser más lento, especialmente con operaciones de copia. Como optimización, muchas implementaciones std::stringcrean una pequeña matriz automática, algo así como char [20]. Si tiene una cadena de 20 caracteres o menos (en este ejemplo, el tamaño real varía), la almacena directamente en esa matriz. Esto evita la necesidad de llamar new, lo que acelera un poco las cosas.

EDITAR:

No esperaba que esta respuesta fuera tan popular, pero como lo es, permítanme ofrecer una implementación más realista, con la advertencia de que nunca he leído ninguna implementación de SSO "en la naturaleza".

Detalles de implementacion

Como mínimo, es std::stringnecesario almacenar la siguiente información:

  • El tamaño
  • La capacidad
  • La ubicación de los datos.

El tamaño podría almacenarse como un puntero std::string::size_typeo como un puntero al final. La única diferencia es si desea restar dos punteros cuando el usuario llama sizeo agregar size_typeun puntero cuando el usuario llama end. La capacidad también se puede almacenar de cualquier manera.

No pagas por lo que no usas.

Primero, considere la implementación ingenua basada en lo que describí anteriormente:

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;
};

Para un sistema de 64 bits, eso generalmente significa que std::stringtiene 24 bytes de "sobrecarga" por cadena, más otros 16 para el búfer SSO (16 elegidos aquí en lugar de 20 debido a los requisitos de relleno). Realmente no tendría sentido almacenar esos tres miembros de datos más una matriz local de caracteres, como en mi ejemplo simplificado. Si es m_size <= 16así, pondré todos los datos m_sso, así ya sé la capacidad y no necesito el puntero a los datos. Si m_size > 16, entonces no lo necesito m_sso. No hay absolutamente ninguna superposición donde los necesito todos. Una solución más inteligente que no desperdicia espacio se parecería un poco más a esto (no probado, solo con fines de ejemplo):

class string {
public:
    // all 83 member functions
private:
    size_type m_size;
    union {
        class {
            // This is probably better designed as an array-like class
            std::unique_ptr<char[]> m_data;
            size_type m_capacity;
        } m_large;
        std::array<char, sizeof(m_large)> m_small;
    };
};

Supongo que la mayoría de las implementaciones se parecen más a esto.

David Stone avatar Apr 25 '2012 16:04 David Stone

SSO es la abreviatura de "Small String Optimization", una técnica en la que pequeñas cadenas se incrustan en el cuerpo de la clase de cadena en lugar de utilizar un búfer asignado por separado.

Mark Ransom avatar Apr 25 '2012 16:04 Mark Ransom