Un tiro bastante rápido (y por lo tanto probablemente incompleta) a responder algunas de las preguntas:
- ¿Por qué se codifica como una plantilla?
Las plantillas proporcionan la capacidad para que las funciones de clase funcionen en tipos de datos arbitrarios. Por ejemplo, la clase de plantilla basic_string<>
puede funcionar en unidades char
(que es lo que hace el typedef std::string
) o wchar_t
unidades (std::wstring
) o cualquier tipo POD. El uso de algo que no sea char
o wchar_t
es inusual (std::vector<>
sería más probable que se use), pero existe la posibilidad.
- ¿Cómo se hace la asignación de memoria?
Esto no está especificado en la norma. De hecho, la plantilla basic_string<>
permite utilizar un asignador arbitrario para la asignación real de la memoria (pero no determina en qué puntos se pueden solicitar las asignaciones). Algunas implementaciones pueden almacenar cadenas cortas en miembros de clase reales, y solo asignar dinámicamente cuando las cadenas crecen más allá de un cierto tamaño. El tamaño solicitado puede ser exactamente lo que se necesita para almacenar la cadena o puede ser un múltiplo del tamaño para permitir el crecimiento sin una reasignación.
Información adicional robado de another SO answer:
Scott Meyer's book, Effective STL, tiene un capítulo sobre las implementaciones std :: string que es una visión digna de las variaciones comunes: "Artículo 15: Tenga en cuenta las variaciones en las implementaciones de cuerda".
Habla de 4 variantes:
varias variaciones en una aplicación ref-contados (comúnmente conocido como copia en escritura) - cuando un objeto cadena se copia sin cambios, refcount se incrementa, pero la cadena real los datos no 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 "optimización de cadena corta". En esta variante, el objeto contiene el puntero de costumbre a los datos, la longitud, el tamaño de la memoria intermedia asignada dinámicamente, etc. Pero si la cadena es lo suficientemente corto, utilizará esa zona para mantener la cadena en lugar de asignar dinámicamente una memoria intermedia
- ¿Por qué es (no es) mejor que las matrices de cab terminadas nulas?
Una forma la clase string
es mejor que una simple matriz terminada en nulo es que la clase gestiona la memoria necesaria, por lo que se reducen defectos que implican errores de asignación o de rueda libre al final de los arrays asignados. Otro beneficio (quizás menor) es que puede almacenar caracteres "nulos" en la cadena. Una desventaja es que tal vez haya algo de sobrecarga, especialmente que casi tiene que depender de la asignación de memoria dinámica para la clase de cadena. En la mayoría de los escenarios que probablemente no sea un problema importante, en algunas configuraciones (sistemas integrados, por ejemplo) puede ser un problema.
¿Tienes un libro en C++? Si no sabes cómo funcionan las plantillas, preguntar por qué una clase las usa parece ser una oportunidad para mí. – GManNickG
http://www.cplusplus.com/reference/string/ es un buen comienzo. – Tristan
¿Es tan difícil de explicar? De acuerdo, tienes que saber explicar esto claramente ... Apuesto a que alguien aquí puede hacerlo sin ser condescendiente. Me pregunto, en realidad, qué pasaría si mis estudiantes vinieran a mí con una pregunta como esa y yo simplemente dijera "ve a aprenderla tú mismo". Chicos ... :) –