Copy-on-write std::basic_string

Олег Ляттэ
Олег Ляттэ

Сейчас, насколько я знаю, реализации строк через COW препятствуют некоторые требования к интерфейсу строк. В частности, чтобы получение неконстантного итератора или референса на символ не инвалидировало другие итераторы и референсы. И отмена такого требования может привести к определённым проблемам (все мы натыкались на обращение по инвалидному итератору - неприятная штука). Однако, возможно, стоит попытаться как-то приемлемо разрулить эту проблему.

 

Ведь сколько пользы принесёт COW string!

1. Станут не нужны всякие string_ref и string_view. Эффективные референсы на подстроки можно будет реализовать прямо в substr()

2. Более экономномное использование памяти. Дополнительная память не выделяется, если одна и та же строка должна храниться в нескольких местах.

3. Следствие из предыдущего пункта: если забыл сделать строке std::move - не беда, копирование строк станет очень дешёвым.

4. Можно будет конструировать полнофункциональные std::string из строковых литератов без аллоцирования памяти.

Возможно, и другие плюшки.

-15
рейтинг
10 комментариев
ru.night.beast
наверно, разумнее делать не cow string, а cow_ptr<T>.
ну и есть проблема с передачей между потоками.
ru.night.beast
Михаил Мальцев
ru.night.beast, как cow_ptr будет понимать, когда нужно выполнить unsharing (т.е. копирование) для произвольного типа T?
Михаил Мальцев
ru.night.beast
Михаил Мальцев, при попытке получения неконстантной ссылки.
ru.night.beast
Олег Ляттэ
ru.night.beast, может, я не замечаю очевидного, но какие новые проблемы с потоками появляются у cow string по сравнению с обычным string?
Олег Ляттэ
ru.night.beast
ru.night.beast
Олег Ляттэ
ru.night.beast, спасибо, для меня оказалось весьма познавательно. Теперь понятно, откуда столько минусов :-D
Олег Ляттэ
Клеванец  Игорь
Идея хорошая, но для отдельного типа
Клеванец Игорь
Олег Ляттэ
Клеванец Игорь, согласен. Делать это в std::basic_string, видимо, не лучшая идея.
Олег Ляттэ
Сергей Садовников
std::string + std::string_view + small string optimization + move semantic делают CoW фактически ненужным. А CoW в многопоточной среде - малоэффективен и, временами, опасен.
Сергей Садовников
Клеванец  Игорь
Сергей Садовников, бывают случаи, когда нужно именно это: тонкая копия константного объекта для работы в нескольких потоках. Редко, но надо
Клеванец Игорь
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).