Поддержка копирования при записи в STL

Я просто читал статья в Википедии о копировании при записи (любопытно, есть ли файловые системы, поддерживающие его), и был удивлен следующим отрывком:

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 ++)?

9

Решение

Например, класс string, предоставляемый стандартной библиотекой C ++, был специально разработан для реализации копирования при записи.

Это полуправда. Да, все началось с разработки COW. Но в спешке открытый интерфейс std :: string был испорчен. В результате он становится COW-враждебным. Проблемы были обнаружены после публикации стандарта, и с тех пор мы застряли на этом. Как стоит в данный момент std::string не может быть поточно-ориентированным COW-ed и реализации в дикой природе не делают этого.

Если вы хотите использовать COW-строку, получите ее из другой библиотеки, например CString в MFC / ATL.

8

Другие решения

gcc использует копирование по ссылке для std :: string. Начиная с версии 4.8, он все еще делает это для C ++ 11, несмотря на это нарушая стандарт.

Посмотреть здесь:

2

По вопросам рекламы [email protected]