¿Qué clases de cadena usar en C ++?

Tenemos una aplicación de escritorio multiproceso en C ++ (MFC). Actualmente los desarrolladores usan CString o std :: string, probablemente dependiendo de su estado de ánimo. Por lo tanto, nos gustaría elegir una implementación única (probablemente algo diferente a esos dos).

CString de MFC se basa en el lenguaje de copia en escritura (COW), y algunas personas afirman que esto es inaceptable en un entorno multiproceso (y probablemente referencia aEste artículo) No estoy convencido por tales afirmaciones, ya que los contadores atómicos parecen ser bastante rápidos, y también esta sobrecarga se compensa de alguna manera con una reducción en las reasignaciones de memoria.

Aprendí que la implementación de std :: string depende del compilador: no es COW en MSVC pero sí, o estaba en gcc. Según tengo entendido, el nuevo estándar C ++ 0x solucionará esto al requerir una implementación que no sea COW y resolverá otros problemas, como los requisitos de búfer contiguo. Entonces, en realidad, std :: string no se ve bien definido en este punto ...

Un ejemplo rápido de lo que no me gusta de std :: string: no hay forma de devolver una cadena de una función sin reasignaciones excesivas (copie el constructor si se devuelve por valor, y no hay acceso al búfer interno para optimizarlo) por referencia "ej.std::string& Result no ayuda) Puedo hacer esto con CString regresando por valor (sin copia debido a COW) o pasando por referencia y accediendo al búfer directamente. Nuevamente, C ++ 0x al rescate con sus referencias de valor r, pero no vamos a tener C ++ 0x en la característica más cercana.

¿Qué clase de cadena debemos usar? ¿Puede la vaca realmente convertirse en un problema? ¿Existen otras implementaciones eficientes de cadenas de uso común? Gracias.

EDITAR: No usamos Unicode en este momento, y es poco probable que lo necesitemos. Sin embargo, si hay algo fácilmente compatible con Unicode (no a costa de la UCI ...), eso sería una ventaja.

Respuestas a la pregunta(7)

Su respuesta a la pregunta