Это не IFNDR, IFNDR назначается явно. Например, достижение точки выхода из функции, не возвращающей void, без return - IFNDR.
[intro.progress] не определяет такой ситуации применительно к циклу while (for и do-while наследуют поведение while), поэтому она не определена "by omission". Это UB, в связи с проблемой найти побочные эффекты и точку выхода, что возможно только при соблюдении требований в [intro.progress].
Причём 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. И исходник используется в качестве первички для создания "изолированного ресурса" словаря.
ламда вставленная в шаблон далеко не всегда оверхэд, часто наоборот. Практика показала что компиляторы вмонтируют ее в код алгоритма. Что может не происходить с функциями, т.к. явно берётся адрес функции. Я уже не говорю о bind, или std::function, там вообще виртуальная диспетчеризация.
Один коллега наоборот жаловался что он не может отлаживать "эти смайлики", отладчик в них "не заходит". Исследование показало, что мелкософт по умолчанию включает function inlining в отладке, его надо было выключить.
втейбл и RTTI не находятся в объекте, там только указатель на первый. Да, вот этот указатель и есть вся нагрузка... И это не индивидуализированная информация, мы не в LUA где виртуальные таблицы на ходу можно редактировать.
IF/NDR - лексически неверный код. UB - семантически неопределённый код. Программа не может быть IF/NDR .потому что ее нет. Есть какой-то непонятный артефакт (если есть).
Учтивая то, с чем программы линкуются. то это как минимум - весь код ядра, компилятора, библиотеки времени исполнения и всех библиотек. А дальше возникает проблема о которой большинство программистов на языках "высокого" уровня не задумывается.. Как быть с поздним связыванием? Как быть с совместимостью? И на чем компилировать. Даже сейчас компиляторы вроде gcc или Майкрософта могут исчерпать память на ОДНОМ файле в некоторых проектах. Глобальное , однородное, неупорядоченное пространство имеет в основном возможность существовать только в системах похожих на виртуальные машины, и то только в пределах одной "сборки". Т.к. обычно эти системы - Java, C-шарп все-таки имеют какое-то позднее связывание.
Позднее связывание подразумевает упорядочивание определений, и все те же проблемы нарушения ODR появляются на уровне "библиотека А использовала версию Х модуля Б, а библиотека Ж использовала версию Y модуля Б".
Объединение является типом-суммой без явного тега (подразумеваемый есть). Канонический тип-сумма - это std::variant. Перечисление - тоже тип-сумма. "Тип-Объединение" - термин, выдуманный джаваскриптистами, в конструктивной теории типов есть только типы-суммы, типы-произведения и индуктивные типы ( с хвостом каких-то "заоблачных" вселенских типов).
Далеко не всегда вызов деструктора исключает 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. Перечисление - тоже тип-сумма. "Тип-Объединение" - термин, выдуманный джаваскриптистами, в конструктивной теории типов есть только типы-суммы, типы-произведения и индуктивные типы ( с хвостом каких-то "заоблачных" вселенских типов).