Jun 27 18:03
@Kromster: Это случайная флуктуация, статистическая погрешность. Меня нет :)
Jun 27 18:03
@Kromster: формально, да, я точно такой же участник сообщества. Фактически – нет, я не принимаю участия в жизни сообщества, так что моё мнение весит немного. Ну и вы прекрасно знаете, почему я не буду открывать вопрос на Мете. Да и Мета умерла, если честно.
Jun 27 18:03
@Kromster: А чем логика морского боя будет отличаться от логики шахмат? Ну другие правила хода — функция проверки корректности другая. Ну Ну другие критерии выигрыша. Но суть-то одна и та же. Мне метка кажется лишённой смысла. Но я всё равно не член комьюнити, так что решайте сами там.
Jun 27 18:03
@Kromster: Это довольно нетрадиционный способ группировки, я бы сначала вынес на обсуждение на Мете. Хотя Мета, наверное, умерла?
Jun 27 18:03
@Kromster: а вы уверены, что нам нужна метка [морской-бой]? Это же просто одна из игр, ничем особо не отличается от крестиков-ноликов.
 
Apr 21 07:38
@Uranus это да. Но, «год прошёл, число сменилось — ничего не изменилось».
Apr 21 07:38
Таблетка памяти для сравнения: у нас пару лет назад мгновенно лишили должности избранного руководителя чата за то, что он один раз назвал негра негром на русском языке (на котором слово «негр» не несёт отрицательных коннотаций). (Кажется, он ещё что-то сказал про Колумба.) Никакие апелляции не помогли.
 
Mar 16 14:19
Может найду
Mar 16 14:18
Там было более подробное описание
Mar 16 14:18
Я где-то видел большую статью о том, как устроена CLR внутри
Mar 16 14:18
@Grundy Точно!
Mar 16 00:26
Кажется, это оно? learn.microsoft.com/en-us/dotnet/standard/…
Mar 16 00:23
@Grundy Да, метаданные хранятся в каком-то специальном heap-е. В .NET Core+ их можно ещё и выгружать
Mar 16 00:23
@Grundy Ну да, но прототипы же где-то хранятся?
Mar 12 20:12
@Grundy: определённых в сборке — да, но программа может во время выполнения создавать новые типы (как в моём примере выше).
Mar 12 20:12
@Grundy: внутреннее представление, из которого можно скрафтить экземпляр Type.
Mar 12 20:12
@ШвеевАлексей: создать представления всех типов невозможно, т. к. юзер может, например, рекурсивно по типу T создать тип T[]. Таким образом, у нас потенциально бесконечный набор типов. (Например: void Rec<T>() => Rec<T[]>(); создаст как угодно много типов (пока не упадёт с переполнением).
 
Jul 13, 2024 20:09
На gcc/clang проще всего просто -fwrapv
Jul 13, 2024 20:04
вроде и всё
Jul 13, 2024 20:03
если unsigned int <=32-битный, то это он и есть, а иначе unsigned long
Jul 13, 2024 20:03
хм, на самом деле никакой особой магии не надо, это выбор из ровно двух вариантов
Jul 13, 2024 20:02
Ага. Не тот, который минимально гарантирует для всех систем, а минимальный на данной системе.
Jul 13, 2024 19:58
Хочется, понятно, минимальный
Jul 13, 2024 19:58
Например, unsigned long 64 бита, а unsigned int 32 бита
Jul 13, 2024 19:58
Возможно, что unsigned int меньше, но вмещает 32 бита
Jul 13, 2024 19:57
@wololo Не гарантируется минимальность
Jul 13, 2024 19:55
То. что в сложении беззнаковых типов возможно UB, это удар для меня. В понедельник расскажу коллегам ещё одну причину того, почему я не вернусь на C++.
Jul 13, 2024 19:54
Интересно, есть ли готовый тип «минимальный >= 32 бита без promotion-а»? Наверняка можно его выцепить шаблонной магией.
Jul 13, 2024 19:53
Переполнения случаются, очевидно, на каждой операции, поэтому каждый раз писать простыню из кастов не очень целесообразно
Jul 13, 2024 19:52
@wololo По идее, если вычисления по модулю 2^32, то им всё равно, будет ли обрезано до 32 бит сразу или потом.
Jul 13, 2024 19:39
@wololo: Но может быть тогда лучше вариант взять unsigned long int и считать в нём? Ему promotion не грозит. А в конце результат обрезать до 32 бит.
Jul 13, 2024 19:39
@wololo: Хм, и правда. Ума не приложу, нафига понадобилось при promotion-е менять беззнаковый тип на знаковый.
Jul 13, 2024 19:39
@wololo: То есть, нужен ещё static_assert(sizeof(int) <= sizeof(uint32_t));?
Jul 13, 2024 19:39
@wololo: проблема именно в 1LL. Если все операнды, включая литералы, имеют тип uint32_t, проблем не будет.
Jul 13, 2024 19:39
@wololo: А можно какой-то источник про переполнение std::uint16_t(65535) * std::uint16_t(65535)?
Jul 13, 2024 19:39
Сложение беззнаковых чисел не дает UB. Так что uint32_t — правильная идея. Смотрите тут раздел Overflows.
Jul 13, 2024 19:39
А зачем его реализовать? Оно и так в c++ происходит по модулю 2^32 (для 32-битных интов).
 
Jun 5, 2023 23:04
@Grundy ну хоть какое-то утешение :-D
Jun 5, 2023 23:03
@Grundy обжм, всегда не любил js :)
Jun 5, 2023 23:00
В этом вроде бы и смысл паттерна Visitor
Jun 5, 2023 22:59
@Grundy Без визитора у нас каждый узел должен реализовывать все возможные оптимизации, получаем God Object. С визитором у нас арифметические оптимизации уходят в отдельный класс, кодогенерация в отдельный класс, и. т. д., а у AST-узла остаётся только Visit.
Jun 5, 2023 22:57
но не функции Execute, ArithmeticSimplify, CheckDeadCode, ...
Jun 5, 2023 22:57
@Grundy Только одну функцию Visit
Jun 5, 2023 22:56
@Grundy Ну да, но вроде бы такого я нигде не видел (плохо смотрел?)
Jun 5, 2023 22:55
Поскольку он собирается делать оптимизацию или выполнение на деревьях, ему нужен просто Visitor, чтобы не ваять по виртуальной функции на каждую операцию на дереве. Но переходы от чистого AST к дереву выполнения и оптимизации на нём очевидно лучше, чем оптимизации прямо на AST.
Jun 5, 2023 22:53
@Grundy Проход по AST — это по сути выполнение
Jun 5, 2023 22:53
@Grundy Ну, вроде я знаю break как выход из цикла и break как отсутствие fall-through в switch case. А есть ещё употребление?
Jun 5, 2023 22:28
В этом и вопрос состоял
Jun 5, 2023 22:28
@Grundy ТС спрашивал, ограничить ли дерево выполнения существующим AST или нет
Jun 5, 2023 22:28
@Grundy Ээээ? Break — команда выхода из текущего цикла. Break в switch — это омоним, имеющий с break в цикле не так много общего