#optimization #language-agnostic
#оптимизация #не зависит от языка
Вопрос:
Рассмотрим следующее:
int status = 0;
while(status < 3)
{
switch(status)
{
case 0:
// Do something
break;
case 1:
if(cond1 amp;amp; cond2 || cond3 amp;amp; cond4)
; // status = 1
else if(cond5)
status = 2;
else
status = 0;
// there could be more else-if statements
break;
case 2:
// Do something else
break;
}
status ;
}
Учитывая, что первый оператор if существует только для удобства чтения и что, как показано, его тело пусто (потому что избыточно), мне было интересно, как компилятор (либо компилятор с опережением времени, либо компилятор точно в срок) может оптимизировать это (если есть оптимизациявозможно).
Комментарии:
1. Этот код не имеет особого смысла и при определенных условиях создаст бесконечный цикл.
2. Первый
if
является функциональным. Это ограничивает область действияelse
.3. @PM77-1 Конечно, это не так, но дело было не в этом. На самом деле я думал, что это можно отрицать в последнем операторе else, сделав его оператором else-if , но я не уверен в этом. Попытался просмотреть выходные данные сборки, но безуспешно.
Ответ №1:
Для компилятора общего назначения ответ отрицательный.
Однако две оптимизации, которые тесно связаны, — это оптимизация потока данных, которая направлена на устранение двойных вычислений и невозможных путей в коде. Другим является Currying, целью которого является оптимизация общей функции в отношении конкретного параметра.