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::stringimplementación está utilizando y si tiene el mismo diseño de memoria que el suyo.
std::stringes 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::stringpara 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::stringllamadas 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::stringmiembro 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::stringmiembro 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::stringversiones, se vincularán perfectamente, pero puede dar lugar a algunos errores desagradables y difíciles de entender. Si cambia su std::stringimplementación, todas las bibliotecas que exponen miembros de STL deben volver a compilarse para que coincidan con el std::stringdiseño del cliente . Y debido a que los programadores quieren que sus bibliotecas sean robustas, rara vez se verá std::stringexpuesto en alguna parte.
Para ser justos, esto se aplica a todos los tipos de STL. IIRC no tienen un diseño de memoria estandarizado.