Этот вопрос наиболее специфичен для C #, но было бы интересно узнать и о C / C ++. Я полагаю, что Java должен использовать условные выражения, учитывая его динамическое приведение типов / отсутствие обобщений во время компиляции.
Лучше всего избегать разветвлений там, где можно использовать логику без разветвлений из соображений производительности. Так что было бы интересно узнать, для потенциального избегания в критических разделах.
Этот вопрос наиболее характерен для C #
Нет, это не так. Вся тема намеренно исключена из спецификации как C #, так и CIL. Спецификациям нечего сказать по этому вопросу.
Вы спрашиваете о деталях реализации компилятора точно в срок.
Теперь, когда это уже прояснено, я могу добавить, что я много лет читал технические статьи Microsoft о том, как анализировать CIL, чтобы найти как простые, так и сложные случаи, которые позволили бы оптимизировать приведение. Тем не менее, Microsoft не вдаваться в подробности, когда они говорят о фактической реализации их джиттер.
Поэтому лучшее, что вы можете сделать, — это написать какой-нибудь тест таким образом, чтобы оптимизатор скомпилировал его, и посмотреть на машинный код, сгенерированный, когда не используется отладчик.
При понижении рейтинга ответ, безусловно, да, поскольку он требует перехода по дереву с множественным выбором на каждом уровне.
При апскейдинге это зависит от того, как выполняется итерация для перехода по дереву типов. В большинстве случаев ответом, вероятно, будет «да», но некоторые оптимизации дерева (в частности, его расположение в памяти) могут привести к тому, что обход будет операцией без ответвлений.