Vsevolod
https://godbolt.org/g/jRNHJX
Alexander "SonnySlave"
🐙 Antony
Должно уметь
Alexander "SonnySlave"
Должно уметь
а это не запрещено разве? так как non-trivial ctro and dtor
Alexander "SonnySlave"
по моим тестам оно не выкидывается
Alexander "SonnySlave"
Должно уметь
https://godbolt.org/g/dVavLz
Constantine
https://godbolt.org/g/dVavLz
а что, компилятор обязан синтезировать new и потом delete?
Alexander "SonnySlave"
Alexander "SonnySlave"
с выделением памяти, поэтому и низя выкинуть
Alexander "SonnySlave"
если ты сделаешь тоже самое со std::string
Alexander "SonnySlave"
то он выкинется, ибо SSO
Constantine
с выделением памяти, поэтому и низя выкинуть
я не понимаю, какой side-effect запрещает компилятору оптимизировать new/delete одного указателя
Alexander "SonnySlave"
поэтому и кастую @antoshkka
Berkus
с выделением памяти, поэтому и низя выкинуть
clang new выкидывает только в путь
Alexander "SonnySlave"
clang new выкидывает только в путь
он выкидывает просто new
Alexander "SonnySlave"
а не внутри вектора
Alexander "SonnySlave"
int side_effect = 0; struct foo { foo() { ++side_effect;} }; ... foo* f = new foo(); delete f;
а какой side_effect в конструировании std::vector<int> ?
Anatoly
а какой side_effect в конструировании std::vector<int> ?
это может быть не только int, но и std::vector<foo>
Alexander "SonnySlave"
Alexander "SonnySlave"
про кастомные типы и так всё ясно
Anatoly
ну, то есть ты предлагает для фундаметельных типов использовать это
Alexander "SonnySlave"
типы с trivial ctor
Anatoly
ну, предложими им
Berkus
он выкидывает просто new
да, но вообще странно - если он вызов конструктора вектора ВЫКИНУЛ то можно и окружающий new выкинуть же
Berkus
это бага
Alexander "SonnySlave"
окей, вечером зарепорчу им. а пока у меня зачёт по политологии
🐙 Antony
а не внутри вектора
Оно упирается вот в эту багу: https://bugs.llvm.org/show_bug.cgi?id=34797
Berkus
похоже на то да
🐙 Antony
Там разадресация проаллоцированного массива убивает оптимизацию
Constantine
сейчас чуть более точный пример напишу
Constantine
#include <memory> struct stored { int x = 42; stored() = default; stored(stored &&) = delete; stored(stored const&) = delete; }; struct inner { stored x; }; struct some { inner inner_; inner const&& get_inner() const&& { return std::move(inner_); } }; int f() { auto & ref = some().get_inner().x; //можно как-нибудь поломать эту строчку? return ref.x; }
Constantine
мне нужно сделать функцию, которая вернет структуру таким образом, что ее поле не может быть запомнено через auto&
Constantine
я правильно понимаю, что что бы я не делал, мне все равно разрешат прострелить ногу из-за возможности приведения всего, что угодно, к const& ?
Constantine
@zamazan4ik а как планируется пофиксить, что если [[pack]] меняет порядок элементов структуры, то экземпляры структуры с одинаковым объявлением перестают быть совместимы сами с собой? то есть каким вообще образом гарантировать, что эта структура одинаковая в разных TU?
Alexander "SonnySlave"
Ситуация ровно такая же будет, как и сейчас
Constantine
Ситуация ровно такая же будет, как и сейчас
А в С++ нет концепции доступа по общему одинаковому префиксу?
Constantine
http://en.cppreference.com/w/cpp/language/data_members#Standard_layout
Constantine
нашел
Constantine
@zamazan4ik вот с этой фигней что делать?
Constantine
это на самом деле очень сильная гарантия, по сути запрещающая компилятору переразмещать поля структуры
Александр
https://wandbox.org/permlink/AXNXryuWTpQakneK Кто-нибудь был в курсе, что можно делать так?
Constantine
только не перегрузка ->* пожалуйтса
Constantine
вроде это не разрешено стандартом, нет?)
Roman
жесть!
Александр
про стандарт не знаю
Vsevolod
так скоро до окамля с хаскилем дойдет с их |:> и прочими закорючками
Constantine
о, кажись, телега багает если пытаться сделать сначала reply а потом forward в этот реплай)
Constantine
О! Придумал отличную идею. Нужно ввести в С++ новый operator *|* который может быть применен на переменную текущего scope, работает как std::move и запрещает последующее использование этой переменной
Constantine
кодовое название "оператор пнх" (это шютка)
Constantine
Константин изобретает Раст
Мне не нравится идея раста полного отказа от расширяемого динамического полиморфизма (как я понял)
Constantine
ты видимо как-то не так понял
Ну мне показалось, что там есть variant вместо потомков интерфейса
Berkus
трейтсы вполне себе динамический полиморфизм юзают, даже vtbl есть
Constantine
То есть я обязан предоставить список всех потомков
Constantine
трейтсы вполне себе динамический полиморфизм юзают, даже vtbl есть
тогда я не понимаю, как они избегают проблем, вызванных динамическим полиморфизмом
Constantine
хотя может быть я ошибаюсь и какая-нибудь магия вроде разделения полиморфных и неполиморфных ссылок решает проблему
Berkus
я всё равно ничего не понял из того что ты сказал, так что будем считать эту проблему надуманной
Constantine
я всё равно ничего не понял из того что ты сказал, так что будем считать эту проблему надуманной
Вот например. Представь, что у тебя есть статический полиморфизм следующего вида: класс Type с требованиями BaseA у которого есть публичное поле value с требованиями BaseB. Забавно, что такое вообще не переводится нормально в динамический полиморфизм, если BaseB содержит, скажем, MoveContructible.
Constantine
Ты просто не можешь ну никак статически проверить, что это объект допустимого типа для поля value
Berkus
Ну я ж говорил что надуманная проблема
Constantine
Ну я ж говорил что надуманная проблема
Совершенно не надуманная. Это невозможность не-константой композиции
Constantine
Динамический полиморфизм справляется, если не определен один тип. Если в выражении не определено два типа (читай operator ==) то динамический полиморфизм фейлит
Alexander "SonnySlave"
melvin
лол
melvin
срочно несите в расточат
Evgenii
compile-time raytracer
Maxim
а что ещё turing-complete, кроме сишного препроцессора и темплейтов?
Maxim
а, ок %)
Александр
kitsu
препроцессор же не полон по тьюрингу, не?
Maxim
http://www.ioccc.org/2001/herrmann1.hint