Saltar al contenido

Diferencia entre string y char[] tipos en C++

Sé libre de compartir nuestro espacio y códigos en tus redes, necesitamos de tu ayuda para aumentar esta comunidad.

Solución:

un char array es solo eso – un array de personajes:

  • Si se asigna en la pila (como en su ejemplo), siempre ocupará, por ejemplo. 256 bytes sin importar la longitud del texto que contiene
  • Si se asigna en el montón (usando malloc() o new char[]) usted es responsable de liberar la memoria después y siempre tendrá la sobrecarga de una asignación de almacenamiento dinámico.
  • Si copia un texto de más de 256 caracteres en el arraypodría fallar, producir mensajes de aserción feos o causar un (mal) comportamiento inexplicable en otra parte de su programa.
  • Para determinar la longitud del texto, el array tiene que ser escaneado, carácter por carácter, para un carácter .

A string es una clase que contiene un char array, pero lo gestiona automáticamente por usted. Más string implementaciones tienen un incorporado array de 16 caracteres (para que las cadenas cortas no fragmenten el montón) y use el montón para cadenas más largas.

Puede acceder a un string’s char array Me gusta esto:

std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

Las cadenas de C++ pueden contener caracteres incrustados, conocer su longitud sin contar, son más rápidas que las matrices de caracteres asignadas al montón para textos cortos y lo protegen de las saturaciones del búfer. Además, son más legibles y fáciles de usar.


Sin embargo, las cadenas de C++ no son (muy) adecuadas para el uso a través de los límites de DLL, porque esto requeriría que cualquier usuario de una función de DLL de este tipo se asegure de que está usando exactamente el mismo compilador y la misma implementación de tiempo de ejecución de C++, no sea que arriesgue su string la clase se comporta de manera diferente.

Normalmente, un string La clase también liberaría su memoria de montón en el montón de llamada, por lo que solo podrá liberar memoria nuevamente si está usando una versión compartida (.dll o .so) del tiempo de ejecución.

En resumen: use cadenas C++ en todas sus funciones y métodos internos. Si alguna vez escribe un .dll o .so, use cadenas C en sus funciones públicas (dll/so-exposed).

Arkaitz tiene razón en que string es un tipo administrado. Lo que esto significa para usted es que nunca tendrás que preocuparte por cuánto tiempo string es, ni tienes que preocuparte por liberar o reasignar la memoria del string.

Por otro lado, el char[] la notación en el caso anterior ha restringido el búfer de caracteres a exactamente 256 caracteres. Si intentó escribir más de 256 caracteres en ese búfer, en el mejor de los casos sobrescribirá otra memoria que “posee” su programa. En el peor de los casos, intentará sobrescribir la memoria que no es de su propiedad y su sistema operativo matará su programa en el acto.

¿Línea de fondo? Las cadenas son mucho más amigables para el programador, char[]s son mucho más eficientes para la computadora.

Bien, string type es una clase completamente administrada para cadenas de caracteres, mientras que char[] sigue siendo lo que era en C, un byte array representando a un personaje string para ti.

En términos de API y biblioteca estándar, todo se implementa en términos de cadenas y no de caracteres.[]pero todavía hay muchas funciones de la libc que reciben char[] por lo que es posible que deba usarlo para esos, aparte de eso, siempre usaría std::string.

En términos de eficiencia, por supuesto, un búfer sin procesar de memoria no administrada casi siempre será más rápido para muchas cosas, pero tenga en cuenta la comparación de cadenas, por ejemplo, std::string siempre tiene el tamaño para verificarlo primero, mientras que con char[] necesita comparar carácter por carácter.

Tienes la opción de amparar nuestra labor fijando un comentario o dejando una puntuación te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *