MT Radio
Загадка: что выведет данный код? https://pastebin.com/ckQ2PA2j
Если бы я получил такую задачу на собеседовании, ушел бы.
Vsevolod
я даже где-то делал static assert на это, потому что иначе ну ни хера ж не работает
Vladislav
Если бы я получил такую задачу на собеседовании, ушел бы.
задачи на детали языка на собеседованиях и не нужны
Vsevolod
вроде, на pdp11 function pointer был больше по размеру, чем void *
Vsevolod
еще что-то припоминаю из раздела farcall в досе, но тут надо мануал почитать
Surreal
Если бы я получил такую задачу на собеседовании, ушел бы.
Стандартная тема же, вроде (хотя я только недавно столкнулся, но вот и в чате сразу увидел). Типа virtual default argument, pure virtual method body и пр. Есть гораздо более глубокие и непонятные вещи. На http://cppquiz.org можно позалипать.
Anton
Подписывать надо exe :)
Anton
https://tproger.ru/news/most-popular-ide-for-c-cpp-2018/amp/
Alexander "SonnySlave"
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r0.html
Berkus
чо, вас опять implicit conversions покусали?
Дмитрий ⬡
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r0.html
Ух ты, а я думал я в этом мире чего-то не знаю и боялся даже заикаться на тему фиксирования формы знаковых чисел, а тут пропозал.
🐙 Antony
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r0.html
Он упустил самый важный момент в бумаге: как это влияет на производительность? До этого компиляторы могли полагаться на то, что знаковое переполнение - это UB и генерировали код который рассчитывал на то, что переполнение не случится. С этой бумагой всё меняется...
Matway
"Let’s stop pretending...", "...few people spell "ones' complement" correctly..." - радикальный чувак.
Matway
Ну так ведь ничего не меняется же. На UB всё равно нельзя было рассчитывать.
Не совсем. Если машину с ones' complement сейчас встретить нереально, то c saturation arithmetic вполне себе. То есть не удовлетворять никаким требованиям и городить UB дешевле, чем гарантировать 2000000000 + 2000000000 = -294967296.
🐙 Antony
Примеры оптимизаций: * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30475 * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52560 * Еще семь страниц выдачи по запросу site:gcc.gnu.org/bugzilla signed overflow missed optimization
🐙 Antony
Ну так ведь ничего не меняется же. На UB всё равно нельзя было рассчитывать.
Именно. Поэтому разработчики компиляторов оптимизировали код в рассчёте что эта ситуация никогда не случится. Если описать поведение при signed overflow, то нельзя будет выкидывать куски кода и сравнения на i + 1000 < i И часть кода потеряет в производительности
Matway
Я понимаю, но это значит, что в коде кто-то потенциально полагается на UB,так?
Нет, если его пропосал примут, то компиляторы должны будут гарантировать [basic.fundamental] 4: "Overflow in the positive direction shall wrap around from the maximum integer value for the type back to the minimum". То есть платить.
🐙 Antony
Более того, в WG21 недавно ходила дурная идея сделать так, чтобы size() возвращал int. В этом случае можно получить небольшой выигрыш в производительности как раз за счёт того, что стандарт гарантирует UB в случае signed переполнения
🐙 Antony
Да наоборот, такую дурь не пропускают, всё хорошо :) давайте лучше яву похороним! Благо и замена есть
Berkus
хотя вейт, я ее практически похоронил - 75% кода на котлине уже
Matway
Более того, в WG21 недавно ходила дурная идея сделать так, чтобы size() возвращал int. В этом случае можно получить небольшой выигрыш в производительности как раз за счёт того, что стандарт гарантирует UB в случае signed переполнения
Мне вчера человек на собеседовании заявил, что ненавидит UB в плюсах, и считает, что надо поправить все места в спеке, где есть UB. В общем, в моей компании он работать не будет :)
Berkus
а у вас в компании любят UB?
конечно любят, такой простор для оптимизаций!
Berkus
Код работает в 1000 раз быстрее... правда такую хуйню делает
Matway
а у вас в компании любят UB?
UB - это главная сила плюсов. Всё остальные плюшки разве что приятны. А UB - это СИЛИЩА.
vladislav
Код работает в 1000 раз быстрее... правда такую хуйню делает
Самая быстрая рука на диком западе, но не самая точная
Matway
Код работает в 1000 раз быстрее... правда такую хуйню делает
В других языках он тоже делает. Четко специфицированную, но её =)
Matway
сила для любителей прострелить себе ногу)
Надо просто уметь готовить. UB - это механизм отложенных платежей. Платить надо только один раз и только в нужном месте. Если правильно готовить UB, об него не споткнёшься.
vladislav
Надо просто уметь готовить. UB - это механизм отложенных платежей. Платить надо только один раз и только в нужном месте. Если правильно готовить UB, об него не споткнёшься.
Это же даже звучит стрёмно "правильно готовить неопределённое поведение". Примерно как "Осторожно заглядывать в бездну безумия" или "Безопасно принимать героин, используя общий на всех шприц"
Alexander "SonnySlave"
правильно готовить UB... хм, звучит как-то херово
Matway
Давайте пример приведу, что-ли.
IharOK
лучше не стало :)
кто хотел понять - тот понял, что речь не о уб)
Andrei
Я думаю сейчас иллюстрирующий пример будет.
Alexander "SonnySlave"
вот обсуждения тред: https://groups.google.com/a/isocpp.org/forum/#!msg/std-proposals/MZzCyAL1qRo/AIImKDx7AgAJ
Dr. Friedrich
Я бы тебя на работу не взял
А я бы и тебя не взял, ты весь код удаляешь! 😭
Крылатый
Со всей тяжестью на душе принимаю тяжкие решения по экстерминатусу кода, поражённого скверной.
Andrei
А я бы вообще никого не взял, потому что у меня работы нет.
Matway
https://ideone.com/t6ZRHw В Джаве мы бы заплатили во всех четвырёх функциях. C++ позволяет заплатить только в одной.
Dr. Friedrich
Я бы тебя на работу не взял
На самом деле, ты его поинт понял неправильно.
Alexander "SonnySlave"
пользу UB расписываешь что ли?
Alexander "SonnySlave"
чатик, здесь кто-то отрицает полезность отсутствия проверки на границы массива во время обращения к элементам массива?
IharOK
так никто и не понял, что хотел сказать чувак
IharOK
горе от ума случилось?)
Dr. Friedrich
https://ideone.com/t6ZRHw В Джаве мы бы заплатили во всех четвырёх функциях. C++ позволяет заплатить только в одной.
К чести сказать, в HotSpot это бы всё так же прекрасно заинлайнилось компилятором, как и в C++.
Alexander "SonnySlave"
так никто и не понял, что хотел сказать чувак
1) Мы тупые 2) Он не смог нормально сказать
Dr. Friedrich
Более того, для исключения проверок тебе тут throw не нужен :)
Alexander "SonnySlave"
К чести сказать, в HotSpot это бы всё так же прекрасно заинлайнилось компилятором, как и в C++.
эмм.... а что hotspot выдал при обращении к массиву за его пределы?
Berkus
чатик, здесь кто-то отрицает полезность отсутствия проверки на границы массива во время обращения к элементам массива?
я отрицаю в общем случае. отсутствие проверки должно быть если ты явно написал вокруг этого доступа unsafe_bitches!{ a[i] }
Dr. Friedrich
эмм.... а что hotspot выдал при обращении к массиву за его пределы?
К данному коду это имеет какое-то отношение? Тут-то нету обращения за пределы.
IharOK
уб - хорошо как следствие наличия определенной свободы действий, что есть тоже хорошо, я так понял и это логично, а говорил он про проектирование приложения
IharOK
а не проектирование уб
Andrei
и что ты хотел этим сказать?
По-моему комментарий недвузначно говорит, что хотел сказать автор. В джаве мы заплатим дополнительными проверками.
Dr. Friedrich
ну если вызвать getThird, то чистой воды UB
Ну, в коде его никто не вызвал :)
Dr. Friedrich
В смысле, там же эксепшен сразу.
Matway
ну если вызвать getThird, то чистой воды UB
А надо контракт к нему прочитать. Плюсы позволяют, используя контракты, не платить там, где это не нужно. Причём гарантированно не платить, а не надеяться на хитрый компилятор.
Dr. Friedrich
Вон у тебя и в плюсах проверка.
IharOK
что не определено по стандарту - сам разрулил
IharOK
вот в чем прелесть