Además de las razones publicadas aquí, también hay otra: la compatibilidad binaria . Los escritores de las bibliotecas no tienen control sobre qué std::string
implementación está utilizando y si tiene el mismo diseño de memoria que el suyo.
std::string
es una plantilla, por lo que su implementación se toma de sus encabezados STL locales. Ahora imagine que está utilizando localmente alguna versión STL de rendimiento optimizado, totalmente compatible con el estándar. Por ejemplo, puede haber optado por introducir intrusiones en el búfer estático en cada uno std::string
para reducir el número de asignaciones dinámicas y errores de caché. Como resultado, el diseño de la memoria y / o el tamaño de su implementación es diferente al de la biblioteca.
Si solo el diseño es diferente, algunas std::string
llamadas de función de miembro en instancias pasadas de la biblioteca al cliente o al revés pueden fallar, dependiendo de qué miembros se desplazaron.
Si el tamaño también es diferente, todos los tipos de biblioteca que tienen std::string
miembro parecerán tener un tamaño diferente cuando se verifican en la biblioteca y en el código del cliente. Los miembros de datos que siguen al std::string
miembro también tendrán desplazamientos desplazados, y cualquier acceso directo / acceso en línea llamado desde el cliente devolverá basura, a pesar de "estar bien" al depurar la propia biblioteca.
En pocas palabras: si la biblioteca y el código del cliente se compilan contra diferentes std::string
versiones, se vincularán perfectamente, pero puede dar lugar a algunos errores desagradables y difíciles de entender. Si cambia su std::string
implementación, todas las bibliotecas que exponen miembros de STL deben volver a compilarse para que coincidan con el std::string
diseño del cliente . Y debido a que los programadores quieren que sus bibliotecas sean robustas, rara vez se verá std::string
expuesto en alguna parte.
Para ser justos, esto se aplica a todos los tipos de STL. IIRC no tienen un diseño de memoria estandarizado.