Я просто читал статья в Википедии о копировании при записи (любопытно, есть ли файловые системы, поддерживающие его), и был удивлен следующим отрывком:
COW также используется вне ядра, в библиотеке, приложении и системном коде. Например, класс string, предоставляемый стандартной библиотекой C ++, был специально разработан для реализации копий при записи:
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
Я не знал, что копирование при записи все поддерживается в STL. Это правда? Применимо ли это к другим классам STL, например std::vector
или же std::array
? Какие компиляторы поддерживают эту оптимизацию (в частности, меня интересует G ++, компилятор Intel C ++ и компилятор Microsoft C ++)?
Например, класс string, предоставляемый стандартной библиотекой C ++, был специально разработан для реализации копирования при записи.
Это полуправда. Да, все началось с разработки COW. Но в спешке открытый интерфейс std :: string был испорчен. В результате он становится COW-враждебным. Проблемы были обнаружены после публикации стандарта, и с тех пор мы застряли на этом. Как стоит в данный момент std::string
не может быть поточно-ориентированным COW-ed и реализации в дикой природе не делают этого.
Если вы хотите использовать COW-строку, получите ее из другой библиотеки, например CString в MFC / ATL.
gcc использует копирование по ссылке для std :: string. Начиная с версии 4.8, он все еще делает это для C ++ 11, несмотря на это нарушая стандарт.
Посмотреть здесь: