¿Cómo se implementa std::string?

6 minutos de lectura

Tengo curiosidad por saber cómo se implementa std::string y en qué se diferencia de c string. Si el estándar no especifica ninguna implementación, entonces cualquier implementación con explicación sería excelente para satisfacer el requisito de cadena dado por el estándar.

  • Es posible que desee obtener el código fuente de algo como gcc y ver cómo lo implementan.

    – James Negro

    23 de septiembre de 2009 a las 13:42

  • Relacionado: stackoverflow.com/questions/3170295/…

    usuario649198

    15 de noviembre de 2012 a las 23:03

¿Como se implementa stdstring
miguel rebabas

Prácticamente todos los compiladores que he usado proporcionan código fuente para el tiempo de ejecución, por lo tanto, ya sea que esté usando GCC o MSVC o lo que sea, tiene la capacidad de ver la implementación. Sin embargo, una gran parte o la totalidad de std::string se implementará como código de plantilla, lo que puede dificultar la lectura.

El libro de Scott Meyer, STL efectivo, tiene un capítulo sobre implementaciones de std::string que es una descripción general decente de las variaciones comunes: “Ítem 15: Sea consciente de las variaciones en string implementaciones”.

Habla de 4 variaciones:

  • varias variaciones en una implementación ref-counted (comúnmente conocida como copia en escritura): cuando un objeto de cadena se copia sin cambios, el refcount se incrementa pero los datos reales de la cadena no. Ambos objetos apuntan a los mismos datos refcounted hasta que uno de los objetos lo modifica, provocando una ‘copia al escribir’ de los datos. Las variaciones están en donde se almacenan cosas como refcount, locks, etc.

  • una implementación de “optimización de cadenas cortas” (SSO). En esta variante, el objeto contiene el puntero habitual a los datos, la longitud, el tamaño del búfer asignado dinámicamente, etc. Pero si la cadena es lo suficientemente corta, usará esa área para contener la cadena en lugar de asignar dinámicamente un búfer.

Además, “More Exceptional C++” de Herb Sutter tiene un apéndice (Apéndice A: “Optimizaciones que no lo son (en un mundo multiproceso)”) que analiza por qué las implementaciones refuntadas de copia en escritura a menudo tienen problemas de rendimiento en aplicaciones multiproceso debido a problemas de sincronización. Ese artículo también está disponible en línea (pero no estoy seguro si es exactamente igual al que está en el libro):

Ambos capítulos valdrían la pena leerlos.

  • Nota (ya que se vincula desde una pregunta reciente): Curiosamente, la implementación de copia en escritura de GCC funciona mejor que la optimización de cadena corta de VC ++ en moverse situaciones, porque moverse Las operaciones se ven afectadas principalmente por la sizeof un objeto.

    – Matthieu M.

    13 de marzo de 2012 a las 7:56

  • Aparentemente, la “optimización de cadenas cortas” a menudo se abrevia como “SSO”: stackoverflow.com/questions/10315041/meaning-of-acronym-sso

    – Raedwald

    25 de abril de 2012 a las 13:33

  • Estoy de acuerdo en que los libros de Scott Meyers y Herb Sutter contienen excelente información general sobre implementaciones de cadenas, pero no dicen exactamente qué implementaciones usan qué optimizaciones (o no optimizaciones). Si quieres saber esto hay una comparación aquí: http://info.prelert.com/blog/cpp-stdstring-implementations

    – dmr195

    14/09/2015 a las 16:06


  • La implementación de gcc está aquí: gcc.gnu.org/onlinedocs/gcc-4.8.1/libstdc++/api/…

    – Yiannis Mpourkelis

    4 de diciembre de 2015 a las 11:05


std::string es una clase que envuelve algún tipo de búfer interno y proporciona métodos para manipular ese búfer.

Una cadena en C es solo una matriz de caracteres

Explicar todos los matices de cómo funciona std::string aquí llevaría demasiado tiempo. Tal vez eche un vistazo al código fuente de gcc http://gcc.gnu.org para ver exactamente cómo lo hacen.

1646750110 73 ¿Como se implementa stdstring
DVK

Hay una implementación de ejemplo en una respuesta en esta pagina.

Además, puede ver la implementación de gcc, suponiendo que tenga instalado gcc. Si no, puede acceder a su código fuente a través de SVN.. La mayor parte de std::string se implementa mediante cadena_básicaasí que empieza por ahí.

Otra posible fuente de información es compilador de watcom

La solución c++ para cadenas es bastante diferente de la versión c. La primera y más importante diferencia es que mientras c usa la solución ASCIIZ, std::string y std::wstring usan dos iteradores (punteros) para almacenar la cadena real. El uso básico de las clases de cadena proporciona una solución de asignación dinámica, por lo que el costo de la sobrecarga de la CPU con el manejo dinámico de la memoria hace que el manejo de la cadena sea más cómodo.

Como probablemente ya sepa, C no contiene ningún tipo de cadena genérica incorporada, solo proporciona un par de operaciones de cadena a través de la biblioteca estándar. Una de las principales diferencias entre C y C++ es que C++ proporciona una funcionalidad envuelta, por lo que puede considerarse como un tipo genérico falso.

En C, debe recorrer la cadena si desea saber su longitud, la función miembro std::string::size() es solo una instrucción (fin – comienzo) básicamente. Puede agregar cadenas de forma segura una a otra siempre que tenga memoria, por lo que no hay necesidad de preocuparse por los errores de desbordamiento del búfer (y, por lo tanto, las vulnerabilidades), porque la adición crea un búfer más grande si es necesario.

Como alguien dijo aquí antes, la cadena se deriva de la funcionalidad del vector, en forma de plantilla, por lo que facilita el manejo de los sistemas de caracteres multibyte. Puede definir su propio tipo de cadena utilizando typedef std::basic_string specific_str_t; expresión con cualquier tipo de datos arbitrario en el parámetro de plantilla.

Creo que hay suficientes pros y contras en ambos lados:

C++ string Pros: – Iteración más rápida en ciertos casos (usando el tamaño definitivamente, y no necesita los datos de la memoria para verificar si está al final de la cadena, comparando dos punteros). Eso podría hacer una diferencia con el almacenamiento en caché): la operación de búfer está empaquetada con la funcionalidad de cadena, por lo que se preocupa menos por los problemas del búfer.

Cadena C++ Contras: – debido a la asignación de memoria dinámica, el uso básico podría causar un impacto en el rendimiento. (Afortunadamente, puede decirle al objeto de cadena cuál debería ser el tamaño del búfer original, por lo que, a menos que lo exceda, no asignará bloques dinámicos de la memoria), a menudo nombres extraños e inconsistentes en comparación con otros idiomas. esto es lo malo de cualquier cosa stl, pero puede usarlo, y hace que se sienta un poco específico como C ++. – El uso intensivo de plantillas obliga a la biblioteca estándar a utilizar soluciones basadas en encabezados, por lo que tiene un gran impacto en el tiempo de compilación.

Eso depende de la biblioteca estándar que utilice.

Puerto STL por ejemplo, es una implementación de la biblioteca estándar de C++ que implementa cadenas, entre otras cosas.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad