ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Copy-on-write std::basic_string

Open apolukhin opened this issue 3 years ago • 1 comments

Перенос предложения: голоса +0, -16 Автор идеи: Олег Ляттэ

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

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

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

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

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

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

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

apolukhin avatar Mar 23 '21 16:03 apolukhin

ru.night.beast, 31 марта 2017, 13:03 наверно, разумнее делать не cow string, а cow_ptr<T>. ну и есть проблема с передачей между потоками.

Михаил Мальцев, 31 марта 2017, 13:10 ru.night.beast, как cow_ptr будет понимать, когда нужно выполнить unsharing (т.е. копирование) для произвольного типа T?

ru.night.beast, 31 марта 2017, 13:12 Михаил Мальцев, при попытке получения неконстантной ссылки.

Олег Ляттэ, 1 апреля 2017, 2:52 ru.night.beast, может, я не замечаю очевидного, но какие новые проблемы с потоками появляются у cow string по сравнению с обычным string?

ru.night.beast, 1 апреля 2017, 11:04 Олег Ляттэ, http://www.gotw.ca/publications/optimizations.htm

Олег Ляттэ, 1 апреля 2017, 14:23 ru.night.beast, спасибо, для меня оказалось весьма познавательно. Теперь понятно, откуда столько минусов :-D

Клеванец Игорь, 31 марта 2017, 14:03 Идея хорошая, но для отдельного типа

Олег Ляттэ, 1 апреля 2017, 14:29 Клеванец Игорь, согласен. Делать это в std::basic_string, видимо, не лучшая идея.

Сергей Садовников, 31 марта 2017, 19:52 std::string + std::string_view + small string optimization + move semantic делают CoW фактически ненужным. А CoW в многопоточной среде - малоэффективен и, временами, опасен.

Клеванец Игорь, 1 апреля 2017, 14:39 Сергей Садовников, бывают случаи, когда нужно именно это: тонкая копия константного объекта для работы в нескольких потоках. Редко, но надо

apolukhin avatar Mar 23 '21 16:03 apolukhin