2013-06-25 9 views
9

ich gerade a Wikipedia article on Copy-on-write lesen war (neugierig, ob es irgendwelche Dateisysteme sind, die es unterstützen), und wurde durch die folgende Passage überrascht:Copy-on-Write-Unterstützung in STL

COW auch außerhalb des Kernels verwendet wird, in Bibliothek, Anwendung und Systemcode. Die String-Klasse von der C++ Standardbibliothek zur Verfügung gestellt, beispielsweise wurde speziell zu ermöglichen Copy-on-Write-Implementierungen entwickelt:

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 

Ich wusste nicht, dass copy-on-write wurde jeder in STL unterstützt . Ist das wahr? Gilt es für andere STL-Klassen, z.B. std::vector oder ? Welche Compiler unterstützen diese Optimierung (insbesondere frage ich mich über G ++, Intel C++ Compiler und Microsoft C++ Compiler)?

+1

Eigentlich 'std :: string' nicht mehr copy-on-write sein können, finden Sie [hier] (http: // Stackoverflow .com/a/16093748/256138). – rubenvb

+0

Die Anforderungen für "std :: vector" und "std :: array" schließen COW für diese Typen aus. Und Anforderungen, die an "std :: string" in C++ 11 gestellt werden, schließen auch COW für Strings aus. – juanchopanza

+0

Ein Beispiel für einen Compiler, der Copy-on-Write unterstützt, war Visual C++ 6.0. Aber seit neueren Versionen nicht mehr unterstützt. Wie bereits erwähnt, wird nicht mehr unterstützt. – Gonmator

Antwort

7

Die String-Klasse von der C++ Standardbibliothek zur Verfügung gestellt, beispielsweise wurde speziell zu ermöglichen Copy-on-Write-Implementierungen entwickelt

, die halbe Wahrheit ist. Ja, es begann Design mit COW im Hinterkopf. Aber in der Eile wurde die öffentliche Schnittstelle von std :: string durcheinander gebracht. Dadurch wird es COW-feindlich. Die Probleme wurden entdeckt, nachdem der Standard veröffentlicht wurde, und wir stecken seitdem fest. Wie steht es derzeit std::string kann Thread nicht sicher COW-ed und Implementierungen in der Wildnis tun es nicht.

Wenn Sie eine COW-Zeichenfolge verwenden möchten, holen Sie sie aus einer anderen Bibliothek, wie CString in MFC/ATL.