Pull to refresh
2
0.1
Send message

Далеко не всегда вызов деструктора исключает UB. В ряде случаев

Ну и подготовка функции к обработке исключений (даже если они не произошли) - не бесплатная операция. Можно еще и о подстановках функций забыть.

Это не IFNDR, IFNDR назначается явно. Например, достижение точки выхода из функции, не возвращающей void, без return - IFNDR.

[intro.progress]  не определяет такой ситуации применительно к циклу while (for и do-while наследуют поведение while), поэтому она не определена "by omission". Это UB, в связи с проблемой найти побочные эффекты и точку выхода, что возможно только при соблюдении требований в [intro.progress].

Причём UB в ряде случаев может случиться и в компиляторе. Он попытаться развернуть ваш бесконечный цикл, считая что из него можно выудить константный результат и получится что-то... или программа (компилятор) упадет.

Приглядитесь к borrow...

Уу.. а как это откомпилилось? Должно быть `(const char*&) - не тот тип, это не UB. Это в сях можно было.

Раст - С++, непохожий на С++, чтобы не вспугнуть Линуса

Если функция принимает ссылку на struct Foo}туда может прийти часть области памяти класса Boo, унаследованного от Foo, или класса, содержащего Foo, или настоящий Foo, не так ли. Но без RTTI - это задача программиста проследить чтобы функция не пыталась выйти за границы и сделать upcast неправильно. Однако RTTI содержится не во всех классах.

Можно. Просто LUA задумывался так. Не даром на нем сталиGUI для игр делать или внутреннюю логику (как в X2). Например гибкий интерфейс World of Warcraft. Blizzard аж пришлось блокировать часть функционала, т.к. люди стали писать автоматическое целеуказание для ПВП и ботов прямо на движке игры.

У полиморфного варианта есть преимущество в том случае, если это не посох и волшебник, а объект учетной записи пользователя и какая-то привилегия (группа?), и то и другое являющееся изолированными ресурсами. На что автор намекал, говоря об "enterprise applications".

во втором случае кстати более интересна ECS подход, где волшебники и посохи перечислены отдельно, а потом связаны принадлежностями.

Только вот в Скайриме был замечательный баг с луком из-за этого. Унаследованный (буквально) в Fallout 4 и Starfield до каких-то поздних обновлений. Из-за того что на смену оружия было еще повешена смена экипировки, проверки амуниции и были препятствующие события, а смена оружия в итоге добавляла абилки, например, абилка "стрелять", персонаж мог застрять в состоянии "есть рот, но кричать не могу".

D UE это не для локализации. Это для визуального проектирования и генерации кода с сохранением привязки к ключевым вещам. Изолированные ресурсы падают лицом в грязь как только встает проблема переносимости или смены версий.

Даже в Qt есть такая проблема и в результат все средства были выкинуты на помойку и теперь библиотека требует чтобы исходный код со строковыми константами был в Unicode. И исходник используется в качестве первички для создания "изолированного ресурса" словаря.

Для обертки в UE те же причины что и у QT - не все целевые платформы имеют все в реализации.

ламда вставленная в шаблон далеко не всегда оверхэд, часто наоборот. Практика показала что компиляторы вмонтируют ее в код алгоритма. Что может не происходить с функциями, т.к. явно берётся адрес функции. Я уже не говорю о bind, или std::function, там вообще виртуальная диспетчеризация.

Один коллега наоборот жаловался что он не может отлаживать "эти смайлики", отладчик в них "не заходит". Исследование показало, что мелкософт по умолчанию включает function inlining в отладке, его надо было выключить.

втейбл  и RTTI не находятся в объекте, там только указатель на первый. Да, вот этот указатель и есть вся нагрузка... И это не индивидуализированная информация, мы не в LUA где виртуальные таблицы на ходу можно редактировать.

RTTI реализован так, что действия с самим объектом в большинстве случаев его не трогает. Это как раз в Java есть постоянная работа в фоне с RTTI.

Если к объекту нет обращений чем виртуальный интерфейс, dynamic_cast или нет обращений к виртуальному базовому классу - ничего не происходит.

У тривиальных типов со стандартной моделью памяти RTTI отсутствует.

Либо они совершаются так же, либо их там нет.

IF/NDR - лексически неверный код. UB - семантически неопределённый код. Программа не может быть IF/NDR .потому что ее нет. Есть какой-то непонятный артефакт (если есть).

Учтивая то, с чем программы линкуются. то это как минимум - весь код ядра, компилятора, библиотеки времени исполнения и всех библиотек. А дальше возникает проблема о которой большинство программистов на языках "высокого" уровня не задумывается.. Как быть с поздним связыванием? Как быть с совместимостью? И на чем компилировать. Даже сейчас компиляторы вроде gcc или Майкрософта могут исчерпать память на ОДНОМ файле в некоторых проектах. Глобальное , однородное, неупорядоченное пространство имеет в основном возможность существовать только в системах похожих на виртуальные машины, и то только в пределах одной "сборки". Т.к. обычно эти системы - Java, C-шарп все-таки имеют какое-то позднее связывание.

Позднее связывание подразумевает упорядочивание определений, и все те же проблемы нарушения ODR появляются на уровне "библиотека А использовала версию Х модуля Б, а библиотека Ж использовала версию Y модуля Б".

Самое смешное в стандарте предполагался недосборщик мусора. Раньше. Его выкинули, т.к. ни один компилятор не смог это реализовать

И при этом на питоне это будет один поток, следовательно еще и тормоза )

Объединение является типом-суммой без явного тега (подразумеваемый есть). Канонический тип-сумма - это std::variant. Перечисление - тоже тип-сумма. "Тип-Объединение" - термин, выдуманный джаваскриптистами, в конструктивной теории типов есть только типы-суммы, типы-произведения и индуктивные типы ( с хвостом каких-то "заоблачных" вселенских типов).

1
23 ...

Information

Rating
2,518-th
Registered
Activity