ideas
ideas copied to clipboard
Copy-on-write std::basic_string
Перенос предложения: голоса +0, -16 Автор идеи: Олег Ляттэ
Сейчас, насколько я знаю, реализации строк через COW препятствуют некоторые требования к интерфейсу строк. В частности, чтобы получение неконстантного итератора или референса на символ не инвалидировало другие итераторы и референсы. И отмена такого требования может привести к определённым проблемам (все мы натыкались на обращение по инвалидному итератору - неприятная штука). Однако, возможно, стоит попытаться как-то приемлемо разрулить эту проблему.
Ведь сколько пользы принесёт COW string!
-
Станут не нужны всякие string_ref и string_view. Эффективные референсы на подстроки можно будет реализовать прямо в substr()
-
Более экономномное использование памяти. Дополнительная память не выделяется, если одна и та же строка должна храниться в нескольких местах.
-
Следствие из предыдущего пункта: если забыл сделать строке std::move - не беда, копирование строк станет очень дешёвым.
-
Можно будет конструировать полнофункциональные std::string из строковых литератов без аллоцирования памяти.
Возможно, и другие плюшки.
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 Сергей Садовников, бывают случаи, когда нужно именно это: тонкая копия константного объекта для работы в нескольких потоках. Редко, но надо