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.
gcc usa copy-by-reference para std :: string. A partir de la versión 4.8, todavía está haciendo eso para C ++ 11, a pesar de que viola el estándar .
Mira aquí:
- ¿Se vuelve a contar std :: string en GCC 4.x / C ++ 11?
- Desactivar COW en GCC