strings definir array c++ string std cstring

c++ - definir - ¿Cómo se implementa std:: string?



vector string c++ (5)

Tengo curiosidad por saber cómo se implementa std :: string y cómo difiere de c string? Si el estándar no especifica ninguna implementación, entonces cualquier implementación con explicación sería genial con la forma en que satisface el requisito de cadena dado por el estándar?


Eso depende de la biblioteca estándar que use.

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



La solución c ++ para cadenas de caracteres es bastante diferente de la versión c. La primera y más importante diferencia es que mientras que 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 dinámica asignada, por lo que en el costo de la sobrecarga de la CPU con el manejo de memoria dinámica hace que el manejo de la cadena sea más cómodo.

Como probablemente ya sepa, la 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 el C ++ proporciona una funcionalidad envolvente, por lo que puede considerarse como un tipo genérico falso.

En C, necesitas recorrer la cadena si quieres saber su longitud, la función de miembro std :: string :: size () es solo una instrucción (final - comenzar) básicamente. Puede anexar cadenas entre sí de forma segura siempre que tenga memoria, por lo que no hay necesidad de preocuparse por los errores de desbordamiento del búfer (y, por lo tanto, de los exploits), ya que el agregar crea un búfer más grande si es necesario.

Como alguien dijo aquí antes, la cadena se deriva de la funcionalidad del vector, de forma personalizada, por lo que es más fácil tratar con 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 arbitrarios en el parámetro de plantilla.

Creo que hay suficientes pros y contras para ambos lados:

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

C ++ string 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 cadena cuál debería ser el tamaño original del búfer, así que, a menos que lo exceda, no asignará bloques dinámicos desde la memoria), a menudo nombres extraños e incoherentes en comparación con otros idiomas. esto es lo malo de cualquier cosa stl, pero puedes usarla, y hace un sentimiento C ++ ish un poco específico. - el uso intensivo de la plantilla obliga a la biblioteca estándar a utilizar soluciones basadas en encabezado, por lo que tiene un gran impacto en el tiempo de compilación.


std :: string es una clase que envuelve un 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 std :: string funciona 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.


Prácticamente todos los compiladores que he usado proporcionan código fuente para el tiempo de ejecución, así que ya sea que esté usando GCC o MSVC o lo que sea, usted tiene la capacidad de observar 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, Effective STL , tiene un capítulo sobre implementaciones de std :: string que es una descripción decente de las variaciones comunes: "Artículo 15: tenga en cuenta las variaciones en string implementaciones de string ".

Él habla de 4 variaciones:

  • Varias variaciones en una implementación ref-contada (comúnmente conocida como copiar en escritura): cuando un objeto de cadena se copia sin cambios, el refcount se incrementa, pero los datos reales de cadena no lo son. Ambos objetos apuntan a los mismos datos refregados hasta que uno de los objetos lo modifica, causando una "copia al escribir" de los datos. Las variaciones están en donde se almacenan cosas como el recuento, los bloqueos, etc.

  • una implementación de "optimización de cadenas cortas" (SSO). En esta variante, el objeto contiene el puntero habitual a datos, longitud, 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, "C ++ Más Excepcional" de Herb Sutter tiene un apéndice (Apéndice A: "Optimizaciones que no son (en un mundo multiproceso)") que explica por qué las implementaciones copiadas con refinanciamiento de 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 de si es exactamente igual a lo que está en el libro):

Ambos capítulos valdrían la pena leer.