Как Switch компилируется в Visual C ++ и насколько он оптимизирован и быстр?

У CSS3 есть легкое решение вашей проблемы. Использование:

background-color:rgba(0,255,0,0.5);

Здесь rgba означает красный, зеленый, синий и альфа-значение. Зеленое значение получается из-за 255, а половина прозрачности получается по 0,5 альфа-значения.

29
задан Ciro Santilli 新疆改造中心996ICU六四事件 23 June 2015 в 10:05
поделиться

2 ответа

Переключатель часто компилируется в таблицу переходов (одно сравнение, чтобы узнать, какой код нужно выполнить), или, если это невозможно, компилятор все равно может изменить порядок сравнений, чтобы выполнить двоичный поиск среди значений (log N сравнений). Цепочка if-else - это линейный поиск (хотя, я полагаю, если все соответствующие значения являются интегральными константами времени компиляции, компилятор в принципе может выполнить подобную оптимизацию).

37
ответ дан 28 November 2019 в 01:45
поделиться

Операторы Switch часто являются обычным источником оптимизации компилятора. То есть то, как они обрабатываются, зависит от настроек оптимизации, которые вы используете в своем компиляторе.

Самый простой (неоптимизированный) способ компиляции оператора switch - рассматривать его как цепочку операторов if ... else if ... . Обычно компиляторы оптимизируют переключатель в виде таблицы переходов , которая может выглядеть примерно так:

if (condition1) goto label1;
if (condition2) goto label2;
if (condition3) goto label3;
else            goto default;
label1:
  <<<code from first `case statement`>>>
  goto end;
label2:
  <<<code from first `case statement`>>>
  goto end;
label3:
  <<<code from first `case statement`>>>
  goto end;
default:
  <<<code from `default` case>>>
  goto end;
end:

Одна из причин, по которой этот метод работает быстрее, заключается в том, что код внутри условных операторов меньше (поэтому существует меньший штраф кэша инструкций, если условие неверно предсказано). Кроме того, случай «провала» становится более тривиальным для реализации (компилятор не использует оператор goto end ).

Компиляторы могут дополнительно оптимизировать таблицу переходов, создав массив указателей (на места, отмеченные метками) и используя значение, которое вы включаете, в качестве индекса в этом массиве. Это устранит почти все условные выражения из кода (за исключением того, что необходимо для проверки того, соответствует ли значение, которое вы включаете, одному из ваших случаев или нет).

Предупреждение: вложенные таблицы переходов сложно сгенерировать, и некоторые компиляторы отказываются даже пытаться их создать.По этой причине избегайте вложения переключателя в другой переключатель , если для вас важен максимально оптимизированный код (я не на 100% уверен, как MSVC, в частности, обрабатывает вложенный переключатель es, но руководство компилятора должно вам сказать).

7
ответ дан 28 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: