c++ compiler-construction stl copy-on-write

c++ - Soporte de copiado en escritura en STL



compiler-construction copy-on-write (2)

Estaba leyendo un artículo de Wikipedia sobre Copy-on-write (curioso si hay algún sistema de archivos que lo soporte), y me sorprendió el siguiente pasaje:

COW también se usa fuera del kernel, en la biblioteca, la aplicación y el código del sistema. La clase de cadena proporcionada por la biblioteca estándar de C ++, por ejemplo, se diseñó específicamente para permitir implementaciones de copia sobre escritura:

std::string x("Hello"); std::string y = x; // x and y use the same buffer y += ", World!"; // now y uses a different buffer // x still uses the same old buffer

No sabía que Copy-on-write era compatible con STL. ¿Es eso cierto? ¿Se aplica a otras clases de STL, por ejemplo, std::vector o std::array ? ¿Qué compiladores soportan esa optimización (en particular, me pregunto sobre G ++, el compilador Intel C ++ y el compilador de Microsoft C ++)?


La clase de cadena proporcionada por la biblioteca estándar de C ++, por ejemplo, se diseñó específicamente para permitir implementaciones de copia sobre escritura

Eso es mitad verdad. Sí, comenzó el diseño con COW en mente. Pero en el apuro, la interfaz pública de std :: string estaba en mal estado. Resultando que obtener COW-hostil. Los problemas se descubrieron después de que se publicara el estándar, y estamos atrapados con eso desde entonces. Como actualmente, std::string no se puede codificar con hilos de rosca COW-ed y las implementaciones en la naturaleza no lo hacen.

Si quieres una cadena que use COW, obténala de otra biblioteca, como CString en MFC / ATL.