Пусто, если оптимизация

#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, целью которого является оптимизация общей функции в отношении конкретного параметра.