A pesar de las críticas, creo que esta es una pregunta válida.
El std::string
no es una panacea. Parece que alguien tomó la clase de un OO puro y la descargó en C++, que probablemente sea el caso.
Consejo 1: Prefiero métodos no amigo no miembros
Ahora que esto se dice, en esta hora de internacionalización, desde luego aconsejaría a diseñar una clase que apoyaría Unicode
. Y digo Unicode
, no UTF-8
o UTF-16
. No encaja (creo) idear una clase que contenga los datos en una codificación determinada. Puede proporcionar métodos para luego generar la información en varios formatos.
Consejo 2: Soporte Unicode
Entonces, hay una serie de puntos en los esquemas de asignación de memoria:
Optimización
- pequeña cadena: la clase contiene el espacio pre-asignado para algunos caracteres (una docena o dos), y así evitar la asignación de montón para esos
- Copiar al escribir: las diversas cadenas comparten un búfer para que la copia sea barata, cuando una cadena necesita modificar su contenido, copia el búfer si no es el único dueño -> el problema es que multihilo supone cargas aquí y que ha sido mostró que para una técnica de uso general esta sobrecarga podría achicar la copia de coste real
- inmutabilidad: "nuevos" lenguajes como
Java
, C#
o Python
utilizar cadenas inmutables. Piense en ello como un conjunto de cadenas, todas las cadenas que contengan "Fooo" apuntarán al mismo buffer. Tenga en cuenta que estos lenguajes son compatibles con la recolección de basura, que más bien ayuda aquí.
elegiría personalmente la "Optimización de cadena pequeña" aquí (aunque no es exclusiva con los otros dos), simplemente porque es más fácil de implementar y de hecho en caso de que (coste asignación del montón, localidad de temas de referencia) beneficiarse.
Las otras dos técnicas son algo complejas frente a la multitracción, y es probable que sean propensas a errores y que no produzcan ningún beneficio real a menos que sean cuidadosamente elaboradas.
Y eso trae mi último consejo:
Consejo 3: no implementan interno de bloqueo en un intento de soporte multihilo
Se retrasará la clase cuando se utiliza en contexto y no SingleThreaded rinde tanto beneficio como piensas cuando se usa en MultiThreaded.
Finalmente, tal vez pueda encontrar algo que se adapte a sus gustos (u obtenga algunos indicadores) navegando por el código existente. No prometo a exponer interfaces "suaves", aunque:
- UCI UnicodeString: soporte Unicode, al menos
- std::string: más de 100 métodos miembros (contando las distintas sobrecargas)
- llvm StringRef: observar cómo muchos algoritmos se implementan como métodos miembros: '(
¿Cuáles son los requisitos de esta cadena y por qué no se puede usar syd:; string o QString, etc.? Estos requisitos tienen que comenzar la investigación – Mark
La mayoría de los programas en C++ se basan en la biblioteca estándar. Si no puede usarlo, esa es una restricción muy importante que debe establecer (y justificar) por adelantado. – Potatoswatter
* por qué * no puedes usar ninguna de las implementaciones de cadenas existentes? – knittl