170 похожих чатов

А вы хотите destructive move в стандарте C++, но без

лишнего гемороя и растовских крякозябр для описания владения объектом?

Тогда мне нужна ваша помошь советом, критикой и т.п. https://github.com/apolukhin/apolukhin.github.io/blob/master/papers/reloc_value_proposal.md

41 ответов

34 просмотра

Какие там кракозябры для описания владения?)

ну то что работает только для локальных переменных правильно, но нужно удалять дефолтное релоцирование, если нетривиальный мув/копирование, всё что мы хотим реально сделать здесь это управление тем нужно ли вызывать деструктор, при этом важно что это должно быть достижимо для компилятора, возможно специальная функция обозначающая это действие. Type t; std::end_lifetime(t); // аналогично С++23 std::start_lifetime_as Вопросы: что будет если применить это на параметр функции? Что если применить это в switch / if? А что если goto?

> без лишнего гемороя и растовских крякозябр > ключевое слово relocate на 8 символов 🤨

вообще есть версия light когда добавляются трейты is_relocatable и возможно теги, внутри проверяется может ли так случится, что тип селф референс и собственно всё. Дальше добавляются алгоритмы std::relocate и контейнеры начинают ими пользоваться если возможно. Например std::ranges::move(rng, out) если видит, что ренж не borrowed, то может сделать relocate, типа того

Тут серьезный cons это то что компилятор должен будет отслеживать relocation объектов. То есть рядом с каждым локальным потенциально релоцируемым объектом будет ещё флажок. Это утяжелит cleanup стека. Понятно что в любом moved out обычно и так есть уже if, будет double if.

как достать элемент из вектора?

feedable
как достать элемент из вектора?

и где аннотация для метода

feedable
и где аннотация для метода

я считаю хватит добавления этого только для самых локальных переменных и всё

Kelbon
я считаю хватит добавления этого только для самых ...

я про то что у нас методы с & и &&, а методов с relocate нету

Kelbon
это struct X { X foo() { return relocate *this; } ...

да, жаль, только что *this это не локал

feedable
да, жаль, только что *this это не локал

пожалуй имеет смысл спецификация метода подобная, чтобы компилятор знал об этом

Я ещё может до конца не понял, но это же ломает ABI? Как переложить destructor на callee?

а еще разве у элементов вектора не динамический скоуп, запрещая вектор таких типов?

🐙 Antony-Polukhin Автор вопроса
Kelbon
ну то что работает только для локальных переменных...

Это отдельный шаг, end_lifetime попзже. Там очень много подводных камней.

🐙 Antony-Polukhin Автор вопроса
🐙 Antony-Polukhin Автор вопроса
Kelbon
вообще есть версия light когда добавляются трейты ...

Да, но с ними не получится нормально передавать объекты в функции и не получится писать non-nullable types

🐙 Antony-Polukhin Автор вопроса
Dmitry Sokolov
Тут серьезный cons это то что компилятор должен бу...

Нет, без флажков, всё на compile time. Подчеркну это в документе

🐙 Antony-Polukhin Автор вопроса
feedable
как достать элемент из вектора?

никак. Доставание элемента нарушит инварианты вектора и всё сломается

🐙 Antony Polukhin
никак. Доставание элемента нарушит инварианты вект...

с элементом в структуре то же самое, выходит?

🐙 Antony-Polukhin Автор вопроса
feedable
я про то что у нас методы с & и &&, а методов с re...

добавляю, упёрся что нельзя релокейтить из параметров функции без слома ABI

🐙 Antony-Polukhin Автор вопроса
Dmitry Sokolov
Так и В параметры тоже получается нельзя.

передавать в параметры можно, там RVO работает там тот же принцип

🐙 Antony Polukhin
добавляю, упёрся что нельзя релокейтить из парамет...

ну я про то что из *this тоже релокейтить нельзя

🐙 Antony-Polukhin Автор вопроса
feedable
с элементом в структуре то же самое, выходит?

ага, никак. Иначе напарываемся на частычный деструктор объекта, а эту банку с червями лучше не открывать

Мотивацию для пропозала можно разделить на 2 части. 1. Желание соптимизировать. 2. Желание исключить потенциальный пустой стейт. Оба этих желания понятны, но на мой взгляд предлагаемый relocate - удовлетворяет их очень частично - создает при этом слишком много вопросов, которые в документе вынесены "на потом". Второе желание удовлетворяется сочетанием типов наподобие not_null<T*> и атрибутов -- уже сейчас можно собрать вполне приличный набор атрибутов, собрать в один и стандартизировать. Не говоря уже о в целом неплохих диагностиках в компиляторах и статанализаторах на тему use-after-move. С первым желанием сложнее. Да, было бы хорошо не вызывать деструкторы, если они для moved-from state сводятся к noop. Нужен ли для этого кейворд? Спорно, хотя поддержка со стороны языка так или иначе нужна. Кейворд легко добавить, но с ним потом еще по меньшей мере 20 лет жить. try relocate нагружает кейворд еще и откатом к std::forward -- это сомнительно. Более детальный отзыв постараюсь написать позже, но мне пока не нравится :) Вообще, как мне кажется, подход заглохшего (?) "Беспредельный copy elision" https://github.com/cpp-ru/ideas/issues/256 покрыл бы множество кейсов, затрагиваемых данным PR, причем без использования какого-либо дополнительного синтаксиса. Не все, конечно, и уж совсем не затронул бы релокацию элементов вектора, с которой все началось. Мне также неясен следующий момент: - Деструктор объекта, передаваемого по значению аргументом функции, вызывается caller'ом. - Мы делаем foo(relocate str), "забывая" про деструктор str - caller по какой-то причине не сделал reloc/std::move из аргумента, таким образом не завладев ресурсом. - ??? - Утечка ресурса. Я не увидел в документе заметки о том, что делать в таком случае. Пробежался по P2785R1, какие-то пометки касательно unowned parameter там есть, но ничего по этому кейсу я и там не увидел. Где я не прав?

🐙 Antony-Polukhin Автор вопроса
🐙 Antony Polukhin
Нда, идея прям на руках рассыпается

эх ещё бы разрешить компилятору последнее использование переменной превращать в мув и улучшить тонну кода где забыли / никогда не было мува

Kelbon
эх ещё бы разрешить компилятору последнее использо...

Так уже частично сделали: implicitly-movable-entities, которым категория выправляется в return/throw-контекстах.

Если ты помнишь, я расписывал две возможные ветки реализации и обнаружил, что надо просто принять [[1144]] Могу поднять логи

🐙 Antony-Polukhin Автор вопроса
Constantine Drozdov
Если ты помнишь, я расписывал две возможные ветки ...

Да-да. Но я в комитете не один, нужно чтобы большинство смирилось)

Когда вызовется деструктор в случае conditional relocate? Хотелось бы конечно чтобы решал компилятор. Но наверняка предлагается вариант где соблюдается обычный порядок. Это добавляет кондишенов. Ещё это довольно плохо совмещается с тем что большинство деструкторов уже conditional в отличие от того же раста. То есть получается разработчик должен будет думать когда лучше написать relocate, а когда move :(

Arelav
Когда вызовется деструктор в случае conditional re...

тут ничего про компилятор нет вовсе, это вручную вызов деструктора

🐙 Antony Polukhin
Да-да. Но я в комитете не один, нужно чтобы больши...

А блумберги хотят это просто свойством типа сделать? Вроде ж есть резон.

🐙 Antony Polukhin
Нет, без флажков, всё на compile time. Подчеркну э...

A a; if (runtime_flag) { foo(relocate a); } bar(); Деструктор a будет вызван после или до вызова bar, в случае если runtime_flag будет false?

Arelav
A a; if (runtime_flag) { foo(relocate a); } bar...

Да не обойдется там без флагов. foo(mayTrowX(), relocate Y, mayThrowZ())

Dmitry Sokolov
Да не обойдется там без флагов. foo(mayTrowX(), r...

Вообще жалко в раст не завезли early drop

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта