2013-06-25 9 views
9

właśnie czyta a Wikipedia article on Copy-on-write (ciekawy czy są jakieś systemy plików, które je obsługują) i był zaskoczony następującym fragmencie:wsparcie kopiowanie przy zapisie w STL

COW jest także wykorzystywany poza jądrem, w bibliotece, aplikacji i kodzie systemowym. Klasa String dostarczana przez C++ biblioteki standardowej, na przykład, został specjalnie zaprojektowany, aby umożliwić implementacje kopiowanie przy zapisie:

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 

Nie wiedziałem, że kopiowanie przy zapisie została każda obsługiwana w STL . Czy to prawda? Czy dotyczy to innych klas STL, np. std::vector lub std::array? Które kompilatory obsługują tę optymalizację (w szczególności, zastanawiam się nad G ++, kompilatorem Intel C++ i kompilatorem Microsoft C++)?

+1

Właściwie 'std :: string' nie mogą być kopiowanie przy zapisie już znaleźć [tutaj] (http: // stackoverflow .com/a/16093748/256138). – rubenvb

+0

Wymagania dotyczące 'std :: vector' i' std :: array' wykluczają COW dla tych typów. Wymagania nałożone na 'std :: string' w C++ 11 również wykluczają COW dla łańcuchów. – juanchopanza

+0

Jednym z przykładów kompilatora obsługującego kopiowanie przy zapisie był Visual C++ 6.0. Ale nie jest już obsługiwana, ponieważ nowsze wersje. Jak wspomniano wcześniej, nie jest już obsługiwany. – Gonmator

Odpowiedz

7

klasy String świadczone przez biblioteki standardowej C++, na przykład, został specjalnie zaprojektowany, aby umożliwić kopiowanie przy zapisie implementacje

To jest pół-prawda. Tak, zaczęło się projektowanie z myślą o COW. Ale w pośpiechu publiczny interfejs std :: string został pomieszany. W wyniku tego COW-wrogie. Problemy zostały odkryte po opublikowaniu standardu i od tego czasu utknęliśmy. W obecnej chwili std::string nie można bezpiecznie łączyć z wątkami COW-ed, a implementacje w środowisku naturalnym tego nie robią.

Jeśli chcesz użyć ciągów wykorzystujących COW, pobierz je z innej biblioteki, na przykład CString w MFC/ATL.

Powiązane problemy