Aidar
Мне вот не до фени когда оно лагает а когда нет
Aidar
Строки один из самых частоиспользуемых ресурсов
Andrew
Так и начинаются специальные использования, это не делает COW строку плохой в своих границах применимости.
Aidar
Делает
Andrew
Тут начинаются тонкости с тем, насколько у тебя часто происходят copy-write-delete на эти самые строки. Не везде это становится проблемой. не везде подойдут COW строки на атомиках.
Aidar
Из-за невозможности использования cow была придумана move semantics
Aidar
Когда оверхед начал что-то значить
Andrew
Но move semantics же не полностью заменяет COW...
Aidar
Ну никто не пишет cow ибо он говно
Andrew
И ничто не мешает сделать COW класс moveable
Aidar
Cow остался в легаси
Aidar
Типа кьюта
Anatoly
нужна ли COW реализация в виде самопала? не нужна, поскольку есть стандарный std::shared_ptr
Andrew
Если я COW на std::wstring заменю у меня вся программа сломается за 20 минут
О том и разговор. COW не заменяется move semantics, последнее банально не может предложить неявного совместного использования памяти. Мне кажется, аргументы против COW вообще всегда чаще всего носят финатичный оттенок.
Andrew
Критики в чатике 😊 Собственно, изначальный вопрос и был в том, сделано ли это уже где-нибудь и почему нет в стандарте, где есть string_view и shared_ptr по отдельности. Это потом все скатилось в "ты хочешь явную иерархию владения".
Aidar
"Страдай, как деды с ANSI C"
Ну ваще с++98 был сильно похож на то что пишут джависты, а теперь не похож
Square
Не столько с процами, сколько с многопоточностью, имхо
Andrew
Подождите, вот есть сценарий: создаются строки, которые редко меняются и шарятся по многим местам/контейнерам и т.п. COW тут работает как добрый малый, который делает все довольно эффективно для использования, практически нулевой ценой для программиста. Я не понимаю, как тут поможет move, если у меня _копии_.
Aidar
Да и компилятору легче и процу легче
Aidar
Вон в стек ио посмотрите
Aidar
Дичь полная
Aidar
Проверки в рантайме флажков
Aidar
На каждом чаре
Aidar
Пздц
Aidar
Тут было то же
Aidar
Во времена ков
🦥Alex Fails
Так Антон же в докладе показал, что ни хрена не вера, а на самом деле страдает перф: https://habrahabr.ru/company/oleg-bunin/blog/352280/
Square
Anatoly
@breakneck11 ты все сделал правильно, но хочешь привнести в свой проект сборку мусора. я бы трижды подумал, поскольку пул как раз и выполняет контроль над временем жизни строк, а string_view обеспечивает незатратный способ передачи строк
Aidar
Сделай хозяина явно
Anatoly
Так у нас же нет родного пулла в плюсах, нет?
std::vector<std::string> pool или std::deque или std::set
Aidar
Сделай пул строк и дергай из него
Andrew
Так Антон же в докладе показал, что ни хрена не вера, а на самом деле страдает перф: https://habrahabr.ru/company/oleg-bunin/blog/352280/
Это все правда, когда у нас частые модификации. Я привел чуть-чуть другой сценарий.
Aidar
Переживать пул строки не должны
Aidar
Если строка переживает родителя который содержит пул родитель должен просто передать пул дальше
Anatoly
а если поместить пул под управление того же shared_ptr решится задачи и с передачей пула
Anatoly
вообщем, не вижу смысла здесь что-то придумывать и помещать строки под управление std::shared_ptr
Square
А киньте в сообщение, где кейс/вопрос. Я чото нипонил
Anatoly
А есть какой-то shared_string_view? Хочется как string_view, но с shared_ptr на строку внутри, чтобы не париться по владению памятью; чтобы не перепридуать COW — пусть указатель будет на константную строку. Если такого нет, почему не добавили в стандарт: сильно медленнее и т.п? Вроде не сложно написать, но странно, почему никто такого не захотел раньше.
Aidar
Не надо
Вы теряете явный контекст жизни строк
Constantine
std::vector<std::string> pool или std::deque или std::set
я бы не стал делать string_view на vector<string> :)
Aidar
Короче контекст это как блок кода с фигурными скобками или типа того
Andrew
Вот объясните мне, я не могу вас понять. Казалось бы, это естественный путь: сделать все минимальными усилиями, с использованием максимально "самоумных" инструментов, где это модет пригодиться: COW, если много копий строк, автоматическое управление владением через shared_ptr, чтобы не думать над этим при изменениях через 2 месяца. А потом, посмотреть на узкое место, которое с огромной вероятностью окажется не в COW и нев shared_ptr. А если оно оказалось там, то, если написан корошо разделяемый код с надежной инкапсуляцией, то и заменить на специально вылизанные аналоги. Но почему-то тут многие ругают "умные" инструменты, приводя в пример ситуации, где их накладные расходы начинают выпирать, и игнорируют случаи, где эти расходы минимальны.
Aidar
Что если половина ИФА будет у вас в одной функции а остальная часть в другой? Это норма?
Constantine
it depends, v.reserve() и все
нога в опасности, да и память последовательно ради этого выделять ниохота
Aidar
foo(){ if (n){ return bar(); } -------------------- bar(){ dosmth }endif }
Aidar
Удобно?
Aidar
То же самое с неявным контекстом и cow
Aidar
Мелкие строки ваще же в ссо
Aidar
Стрингвью поди дольше чем Стринг для них
Andrew
Да нет, меня просто действительно удивила позиция людей, что-то вроде небольшого культурного шока. 😊
Anatoly
Да нет, меня просто действительно удивила позиция людей, что-то вроде небольшого культурного шока. 😊
а потому что с практической точки зрения container<std::string> + std::string_view гораздо эффективнее container<std::shared_ptr<std::string>> + shared_ptr_string_view
Andrew
Мое отличается от существующего string_view в 2 местах: 1. Оно добавляет небольшие накладные расходы. 2. Оно не дает выстрелить себе в ногу. Не возьмусь голословно говорить, какое из них более общее.
Square
Да нет, меня просто действительно удивила позиция людей, что-то вроде небольшого культурного шока. 😊
Кстати не проще ли тогда напилить свой аллокатор чтобы «творить» угар
Aidar
Оно будет раз в 10 дольше работать
Aidar
3) оно даёт право не определять для себя правила написания кода и писать как попало
Andrew
Из-за вечных хождений по указателю? Наверное ты прав, я над большими строками думал, там это бы компенсировалось. Хотя, а разве если у меня константный указатель на const string, она не может положиться в кеш?
Andrew
3) оно даёт право не определять для себя правила написания кода и писать как попало
Есть мнение, что так же можно раскритиковать конструкторы и деструкторы. Кажется, так делал Торвальдс.
Aidar
Есть мнение, что так же можно раскритиковать конструкторы и деструкторы. Кажется, так делал Торвальдс.
Как раз наоборот, конструкторы и деструкторы это правило задающее контекст, а у тебя контекст непонятен, следовательно не понятна иерархия