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 *
Respuesta
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.)
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. –
@Mark: también he escuchado. – GManNickG
@Mark Ransom: Buen punto, aunque eso solo se aplicará en C++ 0x +; C++ 98/03 no tiene ese requisito – dcw
char*
- es del tamaño de un puntero para su arquitectura de CPU.
- Puede ser un valor devuelto por
malloc
ocalloc
onew
onew[]
.- Si es así, hay que pasar
free
odelete
odelete[]
cuando haya terminado. - Si es así, los caracteres se almacenan en el montón.
- Si es así, hay que pasar
- 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.
- Genéricamente, no hay forma de saber si un argumento
- 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
odelete
.- 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 unchar*
.
- 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 devuelvechar*
para uso temporal.
- Define
- Implementa
std::string::iterator
tipo conbegin()
yend()
.string::iterator
es flexible: una aplicación puede hacer que un ayudante depuración súper segura rango-facturado o simplemente una súper eficientechar*
en el toque de un interruptor.
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.
- 1. std :: string :: longitud() vs. std :: string :: size()
- 2. const unsigned char * to std :: string
- 3. Cómo agregar un char a std :: string?
- 4. inicializar std :: string de char * sin copia
- 5. Cómo convertir std :: string a const char *?
- 6. C++ std :: string y NULL const char *
- 7. const char * a const std :: string &
- 8. Rendimiento std :: strstr vs std :: string :: encontrar
- 9. Convierte std :: string en std :: vector <char>
- 10. std :: array <char, N> std :: string
- 11. std :: size_t vs size_t vs std :: string :: size_type
- 12. Java Optimization String vs Char Arrays
- 13. String.Replace (char, char) o Replace (string, string)?
- 14. std :: move entre std :: string y std :: vector <unsigned char>
- 15. Cómo almacenar un const char * en std :: string?
- 16. C++ copy std :: string a char array sin terminación nula
- 17. create std :: string from char * de forma segura
- 18. ¿Cuál usar const char [] o const std :: string?
- 19. Aumento de copia :: array <char> a std :: string
- 20. Llamada ambigua (conversión de char * a lambda vs std :: cadena)
- 21. std :: vector <std::string> crash
- 22. ¿Qué tiene más sentido: char * string o char * string?
- 23. Diferencia entre char * str = "STRING" y char str [] = "STRING"?
- 24. Char Matriz VS Char *
- 25. std :: string o std :: vector <char> para contener datos en bruto
- 26. convirtiendo una matriz de cadenas terminadas nulas const char * a std :: vector <std :: string>
- 27. std :: string :: assign() causa segfault
- 28. ¿Cómo puedo tomar posesión de un C++ std :: string char data sin copiar y mantener el objeto std :: string?
- 29. Cómo convertir System :: String^en std :: string?
- 30. SWIG: Cómo ajustar std :: string & (std :: string pasado por referencia)
Los punteros (y especialmente 'char *') no son tipos de clase y no se pueden derivar de. :-) –