2013-06-25 2 views
9

Je viens juste de lire a Wikipedia article on Copy-on-write (curieux de savoir s'il y a des systèmes de fichiers qui prennent en charge), et a été surpris par le passage suivant:support Copy-on-write dans STL

COW est également utilisé en dehors du noyau, dans la bibliothèque, l'application et le code système. La classe de chaîne fournie par la bibliothèque standard C de, par exemple, a été spécialement conçu pour permettre des implémentations de copie en écriture:

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 

je ne savais pas qui a été tous pris en charge dans STL copie sur écriture . Est-ce vrai? Cela s'applique-t-il aux autres classes STL, par ex. std::vector ou std::array? Quels compilateurs supportent cette optimisation (en particulier, je m'interroge sur G ++, le compilateur Intel C++ et le compilateur Microsoft C++)?

+1

En fait, 'std :: string' ne peut pas être copy-on-write plus, voir [ici] (http: // stackoverflow .com/a/16093748/256138). – rubenvb

+0

Les emplacements requis sur 'std :: vector' et' std :: array' excluent COW pour ces types. Et les exigences imposées à 'std :: string' dans C++ 11 excluent COW pour les chaînes aussi. – juanchopanza

+0

Un exemple de compilateur prenant en charge la copie sur écriture était Visual C++ 6.0. Mais pas supporté depuis les nouvelles versions. Comme dit précédemment, n'est plus supporté. – Gonmator

Répondre

7

La classe de chaîne fournie par la bibliothèque standard C++, par exemple, a été spécialement conçu pour permettre des implémentations de copie en écriture

C'est une demi-vérité. Oui, la conception a commencé avec COW en tête. Mais dans la précipitation l'interface publique de std :: string a été foiré. Résultat il devient COW-hostile. Les problèmes ont été découverts après la publication de la norme, et nous sommes coincés avec cela depuis. Comme les stands actuellement std::string ne peuvent pas être thread-safe COW-ed et les implémentations dans la nature ne le font pas.

Si vous souhaitez utiliser une chaîne utilisant COW, récupérez-la dans une autre bibliothèque, telle que CString dans MFC/ATL. Gcc utilise la copie par référence pour std :: string.