Anatoly
std::move(x) же ничего не вычисляет
а конструирование параметра?
Matwey
Логично
🐙 Antony
я в этих двух штуках ваще не вижу разницы результата
На всякий случай перепроверил. Вариант a -= (b < 0); занимает всегда один такт if (b < 0) { a--; } занимает 0.51 такт в случае угадывания branch predictor и НЕ трогает память. А вот если не угадал - то стоимость будет 1.49 тактов Если честно - хз какой вариант быстрее :)
Aidar
а как так мерить?
🐙 Antony
а как так мерить?
Intel Architecture Code Analyzer
Aidar
спс
🐙 Antony
спс
Сам о ней пару недель наза узнал. До этого ходил и ныл "хочу тулзу, которая в статике анализирует производительность куска кода"
Михаил
А я думаю тут PGO может помочь 😊
Ну или просто профиль нагрузки снять и все понятно будет
🐙 Antony
спс
НО там тулза своеобразная. Она хорошо работает на прямом участке кода, без ветвлений и циклов. Но при этом считает что всё поместилось в кеши! Что она считает в случае цикла - или ветвления мне не понятно.
Matwey
А в STL не завезли indirect_iterator еще?
Matwey
И не планируют?
Andrew
А есть какой-то shared_string_view? Хочется как string_view, но с shared_ptr на строку внутри, чтобы не париться по владению памятью; чтобы не перепридуать COW — пусть указатель будет на константную строку. Если такого нет, почему не добавили в стандарт: сильно медленнее и т.п? Вроде не сложно написать, но странно, почему никто такого не захотел раньше.
Aidar
зачем оно
Aidar
юзай string
Andrew
Так не хочу кучу копий
Aidar
cow ненужен
Andrew
1. Бывает полезен
Aidar
не хочешь копии юзай стрингвью
Andrew
2. Это не cow
Aidar
не бывает он полезен это невявное управление ресурсами
Andrew
Да? А shared_ptr тоже ошибка?
Aidar
в некоторых местах явно сделать невозможно
Andrew
Если shared_ptr не ошибка, то я не понимаю, как объект = shared_ptr + 2 поля связанные с ним может быть ошибкой.
Aidar
сделай shared_ptr<string> если надо
Aidar
но врятли тебе надо
Aidar
ты просто не смог определить контекст
Ivan
https://github.com/Microsoft/GSL/blob/master/include/gsl/string_span
Andrew
Что? Я-то как раз все определил, и да, я и предлагал shared_ptr от string. Еще раз, сейчас использование string_view при сохранении его куда-то, а не просто создал-пропихнул_туда_сюда_по_стеку-удалил, требует помнить, кто владеет строкой и т.п. Хочу что-бы я об этом не думал, и чтобы string_view не превращался в тыкву. Собственно, вопрос был, есть ли уже где-то такое и разве я хочу странного?
Ivan
возможно с небольшим допилом это то что тебе нужно
Aidar
>при сохранении его куда-то вроде это невалидно без соотв постреенного апи
Aidar
конструируй строки и храни
Andrew
Да, и поэтому, его нельзя нормально сохранять в контейнеры, переживающие своего создателя, в чем и проблема. В моем случае я понял, что при выдаче наружу некоторых мест мне придется конвертировать руками u_map<string_view,...> в u_map<string, ...>
Aidar
и если тебе надо чтото хранить тебе надо юзать не стрингвью а стринг
Aidar
и передавать стринг
Aidar
по копии
Andrew
Типо map<std::cref<std::string>,...> ? Но у меня работы с парсингом и подстроками много, из-за чего и перешел на string_view
Aidar
нет зачем там ссылки если ты хочешь пережить создателя
Aidar
вся проблема в нечеткости иерархии
Constantine
У меня, кстати, безумная идея
Constantine
Вот представьте класс struct some { std::string first: std::string second; }; а нельзя как-нибудь хачить SSO чтобы если первая строка короткая, в нее вторая влезала?
Anatoly
Типо map<std::cref<std::string>,...> ? Но у меня работы с парсингом и подстроками много, из-за чего и перешел на string_view
ну это нормально, а зачем хранить string_view? храните string и образовывайте string_view из хранимых объектов или гарантируйте, что string переживет string_view
Andrew
Блин, да потому что у меня например 1к уникальных длинных строк, и в программе будут храниться до, пусть, 100к их подстрок. Я могу сохранить высоко-высоко, на global уровне вектор длинных строк, тогда все string_view остануться валидны, примерно так оно сейчас и сделано (без глобальных переменных, разумеется). Но я не уверен, что вообще хочется тут думать об этом владении.
Aidar
или оно есть всегда
Andrew
А вам не пора пиликать персистентные структуры, если у вас такая фигня?
Так то, что я предлагаю, и является, по сути, персистентной структурой — у меня все readonly.
Aidar
или оно variant<string, string_view>
Andrew
или оно есть всегда
Ну с моим классом оно и будет всегда
Constantine
Типа легендарной std::rope
Aidar
Ну с моим классом оно и будет всегда
если вам нужно пережить родителя вы перемещаете строку в себя а возвращаете стрингвью на объект и сохраняете в родителе стригвью
Aidar
ну не в родителе
Aidar
а в коде родителя
Constantine
Здесь вопрос, нужна ли вам последовательность в памяти
Constantine
Для этих строк
Andrew
Не immutable а persistent
Я понимаю, переразирую: в мем случае я хочу получать view на immutable container, при чем view не дадут умереть контейнеру, пока хоть один из них жив. И я не особо понимаю, зачем мне тут чистая персистентность: массив строк создается 1 раз, после этого только появляются на него вьюхи.
Andrew
или оно variant<string, string_view>
Я понял предложение, но оно мне вообще не нравится. 1. Тогда уж создать специальную пару, чтобы самому не париться, где s_w где string, иначе это начинает походить на ручной менеджмент памяти. 2. Это какой-то оверкилл и переусложнение, модель с shared_ptr про то же, но в ней нет плывущих ролей, там нельзя в них ошибиться.
Andrew
у вас же сейчас все концептуально чисто, зачем добавлять оверхед с shared?
Ну да, текущая модель типична для плюсов, поэтому ее бремя не вызывает у C++'сников отторжения. Я внезапно понял, что после полугода программирования на языке со сборкой мусора у меня появилось отторжение к любой зависимости со владением, которая хоть как-то может сломаться и заставляет помнить о себе при смене иерархии. Наверное, пора снова привыкать к плюсам. Просто, ну вот добавили же shared_ptr, а захотел применить — "нинужна!!".
Aidar
ваще не понимаю например в чем проблема такой штуки: string_view cache::push(string);
Andrew
Так реализовали в одной джаве, потом передумали - очень неприятные способы получить мусор в памяти
Можно, кстати, вопрос, как? За исключанием циклических ссылок, которых в данном случае быть не может, кажется, мусор при использовании shared_ptr появляться не должен.
Andrew
Выбор подстроки как shared_ptr захватывает хозяина
Да, а что не так? Пока у меня есть хоть одна подстрока, мне нужен этот хозяин, все же верно. Как только последняя построка перестанет быть нужна, она в своем деструкторе похоронит и хозяина.
Александр
Типа легендарной std::rope
это что? на хабре нашёл что-то
Constantine
это что? на хабре нашёл что-то
Реализация строкового класса на персистентных структурах
Andrew
Проблема что нужна подстрока, а основная строка давно не нужна, так что ради подстроки в 32 буквы храним 10к
А, понял, если это мусор, то да. Но ведь там есть глобальных пулл строк, так что они это специально. Если это так принципиально, то мы все равно придем к подобию COW 😞
Constantine
Нет явное лучше неявного
Угу, поэтому C должно быть явное
Constantine
Там просто надо вешать SSO до длины в 50, видимо
Andrew
Нет явное лучше неявного
Так это не про детали реализации. В случае правильной COW строки и ее типового использования, пользователю до фени, что там внутри происходит.