El estándar STL no requiere que std :: string se vuelva a contabilizar. Pero, de hecho, la mayoría de las implementaciones de C++ proporcionan cadenas de recuento y de copiado por escritura, lo que le permite pasar cadena por valor como tipo primitivo. Además, estas implementaciones (al menos g ++) usan operaciones atómicas , lo que hace que estas cadenas estén libres de enclavamiento y seguras para el hilo.¿Por qué las cadenas de VC++ no son contadas por referencia?
prueba fácil muestra la semántica copia en escritura:
#include <iostream>
#include <string>
using namespace std;
void foo(string s)
{
cout<<(void*)s.c_str()<<endl;
string ss=s;
cout<<(void*)ss.c_str()<<endl;
char p=ss[0];
cout<<(void*)ss.c_str()<<endl;
}
int main()
{
string s="coocko";
cout<<(void*)s.c_str()<<endl;
foo(s);
cout<<(void*)s.c_str()<<endl;
}
Sólo dos direcciones se imprimen exactamente después de que se utiliza un miembro no constante.
Probé este código usando el compilador HP, GCC e Intel y obtuve resultados similares - las cadenas funcionan como contenedores de escritura.
Por otro lado, VC++ 2005 muestra claramente que cada cuerda está completamente copiada.
¿Por qué?
Sé que hubo un error en VC++ 6.0 que tenía una implementación no segura para subprocesos de recuento de referencias que causaba cambios de programa aleatorios. ¿Es este el motivo? Ellos simplemente tienen miedo de usar el recuento de ref, incluso si es una práctica común? Prefieren no utilizar el recuento de ref en todo para solucionar el problema?
Gracias
creo que Scott Meyers menciona algo similar en uno de sus libros - no puede citar (y ni siquiera seguro) porque yo no los tengo conmigo en el momento. –
+1, pasé 10 minutos buscando esa referencia. Hay tantas preguntas C++ en SO que simplemente requieren un puntero a la escritura de Herb. – JaredPar
En realidad, este artículo muestra claramente que las cadenas COW que utilizan operaciones atómicas tienen casi el mismo rendimiento que las cadenas normales COW. (diferencia del 25%) Así que no es demasiado "sobrecarga", y mucho más para hacer una copia real. – Artyom