¿Qué problemas dan los objetos de tipo String?

Buenas a todos.

He estado leyendo varios temas de este foro (en su versión inglesa) y he visto cómo algunos desaconsejan (además bastante) el uso de la clase String, pero no termina de quedarme claro cuáles son los motivos.

¿Estáis de acuerdo en esto? Y si es así, ¿qué agujeros quedan por tapar en esta clase?

Muchas gracias de antemano.

Saludos!

La clase String consume muchos recursos y es ineficiente para un uso intenso del procesador, pero de ahi a que tenga agujeros, me parece que esa apreciación es errada. Es una clase nativa y propia de C++, madura y muy util. Yo siempre aconsejo usarla en expecial a los novatos ya que les simplifica la vida. Cuando quieren sacarle más jugo al procesador, deben intentar acercarse más a la maquina, y en eso, String puede no ser la opción ideal… igual no soy un experto en Atmel, pero si programo hace 25 años…

Pero no tiene problema de pérdidas de memoria ni nada, ¿no? Eso es principalmente lo que me asusta que pueda tener...

Soy consciente de que cuanto más quieres acercarte a un procesamiento óptimo más debes ahondar en tipos de variables primitivas y olvidarte de clases, ya que siempre arrastran "información" extra. Mi principal preocupación es que puedan provocar fallos, afectando a sistemas que se supone deben asegurar una larga continuidad en su funcionamiento.

Apenas uso String, sólamente para aplicaciones sencillas cuando no tengo ganas de comerme la cabeza usando chars, que ciertamente son bastante inmanejables.

bivalvo:
Pero no tiene problema de pérdidas de memoria ni nada, ¿no? Eso es principalmente lo que me asusta que pueda tener...

Hay que admitirlo: String tiene su razón de existir. Facilita mucho el manejo de cadenas de caracteres, lo que lo hace perfecto para principiantes.
Sin embargo esa facilidad tiene un precio, y se paga con eficiencia.

Para pruebas y programas que se ejecutan en lapsos cortos (pero con al menos 300 bytes libres de RAM) funciona; pero si es para algo definitivo y donde la fiabilidad importa mucho, ahí es cuando no se recomienda utilizarlo.

El problema es que por la forma en que el objeto opera, tiende a fragmentar el espacio en memoria, dejando "huecos" que eventualmente imposibilitan la creación de más objetos. Cuando se llega a este punto, se crea un "estado excepcional" que el compilador nunca programó cómo manejarlo; y por esta razón al final caemos al punto de bloquear indefinidamente el programa, lo que conocemos como el "cuelgue" del programa.

Estamos hablando de programar para un entorno de muy limitados recursos y carente de sistema operativo; por eso algunas de las facilidades se tienen que sacrificar.

Por ende, cualquier tipo de clase similar que uno elabore puede producir también fragmentación de memoria y colapso. Es decir, que el “problema de los String” que tanto da que hablar no es otra cosa que un problema de limitación del micro, como podría pasar con cualquier otro objeto.

bivalvo:
Por ende, cualquier tipo de clase similar que uno elabore puede producir también fragmentación de memoria y colapso.

Solo si al operar con él se pasan destruyendo y creando otros objetos o arrays (cosa que suele hacer String), de contrario no sería tan problemático.

bivalvo:
Es decir, que el "problema de los String" que tanto da que hablar no es otra cosa que un problema de limitación del micro, como podría pasar con cualquier otro objeto.

Por ahí vamos.

El manejo de memoria utilizado en Arduinos es tan rudimentario (de hecho yo lo llamaría "semi-automático") que es vulnerable a la fragmentación o otros problemas que conlleva el manejo manual.

En lenguajes como Java, la fragmentación no supone un problema porque el entorno de ejecución periódicamente, por necesidad o por código, realiza este proceso. Para un microcontrolador como el que viene en el Arduino Uno, este proceso tiene un costo computacional exorbitantemente alto (no querrás que de repente en un momento crítico el programa se detenga durante unos segundos).

Perfectamente explicado, gracias Lucario!