2010-04-20 29 views
13

std :: string almacena los datos de manera diferente que un char * en stack o heap o simplemente se deriva de char * en una clase?std :: string vs. char *

+6

Los punteros (y especialmente 'char *') no son tipos de clase y no se pueden derivar de. :-) –

Respuesta

5

Si quiere decir, ¿almacena de forma contigua, entonces la respuesta es que no es necesario, pero todas las implementaciones conocidas (para mí, de todos modos) lo hacen. Esto es más probable para soportar los requisitos c_str() y data() miembros, que es para devolver una cadena contigua (terminada en nulo-en el caso de c_str())

En lo que a la que se almacena la memoria, por lo general en el montón. Pero algunas implementaciones emplean la "Optimización de cadenas cortas", en la que los contenidos de cadenas cortas se almacenan en un pequeño búfer interno. Entonces, en el caso de que el objeto de cadena esté en la pila, es posible que los contenidos almacenados también estén en la pila. Pero esto no debería cambiar la forma en que lo usa, ya que uno de los objetos se destruye, la memoria que almacena los datos de cadena se invalida en cualquier caso.

(por cierto, aquí está an article on a similar technique applied generally, lo que explica la optimización.)

+6

El comité de C++ 0x descubrió que todas las implementaciones actuales se almacenan contiguamente, por lo que decidieron reforzar el idioma y hacerlo un requisito. Lo siento, no tengo una referencia para respaldarlo. –

+0

@Mark: también he escuchado. – GManNickG

+1

@Mark Ransom: Buen punto, aunque eso solo se aplicará en C++ 0x +; C++ 98/03 no tiene ese requisito – dcw

13

char*

  • es del tamaño de un puntero para su arquitectura de CPU.
  • Puede ser un valor devuelto por malloc o calloc o new o new[].
    • Si es así, hay que pasar free o delete o delete[] cuando haya terminado.
    • Si es así, los caracteres se almacenan en el montón.
  • Puede ser el resultado de "descomposición" de un char[ N ] (constante N) de matriz o literal de cadena.
    • Genéricamente, no hay forma de saber si un argumento char* apunta a la pila, al montón o al espacio global.
  • No es un tipo de clase. Participa en expresiones pero no tiene funciones de miembro.
  • Sin embargo, implementa la interfaz RandomAccessIterator para su uso con <algorithm> y tal.

std::string

  • es el tamaño de varios punteros, a menudo tres.
  • Se construye a sí mismo cuando se crea: no es necesario new o delete.
    • Posee una copia de la cadena, si la cadena puede ser alterada.
    • Puede copiar esta cadena de char*.
    • De forma predeterminada, internamente usa new[] tanto como lo haría para obtener un char*.
  • establece la conversión implícita que hace transparente la construcción de un char* o literal.
  • Es un tipo de clase. Define otros operadores para expresiones como catenation.
    • Define c_str() que devuelve char* para uso temporal.
  • Implementa std::string::iterator tipo con begin() y end().
    • string::iterator es flexible: una aplicación puede hacer que un ayudante depuración súper segura rango-facturado o simplemente una súper eficiente char* en el toque de un interruptor.
2

Estos resolver diferentes problemas. char* (o char const*) apunta a una cadena de estilo C que no es necesariamente propiedad de la que almacena el puntero char*. En C, debido a la falta de un tipo de cadena, necesariamente suele usar char* como "el tipo de cadena".

std::string posee los datos de cadena a los que apunta. Por lo tanto, si necesita almacenar una cadena en algún lugar de su clase, es probable que desee utilizar std::string o la clase de cadena de la biblioteca en lugar de char*.

En la contigüidad del almacenamiento de std::string, otras personas ya respondieron.

Cuestiones relacionadas